2012-12-21 145 views
1

想要從KoObservableArray中刪除重複值。我有以下的JS文件。我想要將用戶界面中的名稱列作爲下拉列表綁定,並刪除重複的值。從KOObservable陣列刪除重複項

建議最好的方法來做同樣的事情。

JS文件

$(function() { 
    var initialData = [ 
    { name: "Well-Travelled Kitten", sales: 352, price: 75.95 }, 
    { name: "Speedy Coyote", sales: 89, price: 190.00 }, 
    { name: "Furious Lizard", sales: 152, price: 25.00 }, 
    { name: "Furious Lizard", sales: 213, price: 25.00 }, 
    { name: "Indifferent Monkey", sales: 1, price: 99.95 }, 
    { name: "Speedy Coyote", sales: 89, price: 190.00 }, 
    { name: "Brooding Dragon", sales: 0, price: 6350 }, 
    { name: "Ingenious Tadpole", sales: 39450, price: 0.35 }, 
    { name: "Optimistic Snail", sales: 420, price: 1.50 } 
]; 

    var PagedGridModel = function (items) { 
     this.items = ko.observableArray(items);  
    }; 

    ko.applyBindings(new PagedGridModel(initialData)); 
}); 

HTML File 
<body> 

<nav> 
<label for="name">Name</label> 
     <select id="name" data-bind="options: items, optionsText: 'name', optionsCaption:'All'"> 
     </select> 
</nav> 

</body> 

上面給我的下拉重名。

+0

一種方法是創建一個計算陣列,它會選擇只有唯一的名稱,然後綁定你選擇這個變量。另一種方法是首先不要將重複項添加到主數組中。 – ryadavilli

+0

只有名稱字段是重複的,但其他字段不是,因此無法過濾不同的值。我可以有一個計算數組的例子嗎? – user1899731

回答

3

請參閱下面有關如何讓計算的observable返回數組的示例。我剛剛寫下了過濾的邏輯,但它可能不正確或最佳,我會留給你改進。

$(function() { 
    var initialData = [ 
    { name: "Well-Travelled Kitten", sales: 352, price: 75.95 }, 
    { name: "Speedy Coyote", sales: 89, price: 190.00 }, 
    { name: "Furious Lizard", sales: 152, price: 25.00 }, 
    { name: "Furious Lizard", sales: 213, price: 25.00 }, 
    { name: "Indifferent Monkey", sales: 1, price: 99.95 }, 
    { name: "Speedy Coyote", sales: 89, price: 190.00 }, 
    { name: "Brooding Dragon", sales: 0, price: 6350 }, 
    { name: "Ingenious Tadpole", sales: 39450, price: 0.35 }, 
    { name: "Optimistic Snail", sales: 420, price: 1.50 } 
]; 

    var PagedGridModel = function (items) { 
     var self = this; 
     self.items = ko.observableArray(items);  
     self.uniqueItems = ko.computed({ 
      var filteredArray = []; 
      var i; 
      $.each(self.items(), function (index, item) { 
       bool alreadyAdded = false; 
       for (i in filteredArray) { 
         if (filteredArray[i].name == item.name) { 
          alreadyAdded = true; 
         } 
       } 
        if (!alreadyAdded) { 
         filteredArray.push(item); 
        } 
      }); 
      return filteredArray; 
     }); 
    }; 

    ko.applyBindings(new PagedGridModel(initialData)); 
}); 

最後在你的HTML

<select id="name" data-bind="options: uniqueItems, optionsText: 'name', optionsCaption:'All'"> 
</select>