2013-03-12 78 views
2

我使用KnockoutJS,有一個多維數組觀察到的屬性值(對象):刪除從多維Javascript數組中的項目的基礎上,

self.navItems = ko.observableArray([ 
    { name: "test1", children: [ 
     { name: "test1child1", children: [] }, 
     { name: "test1child2", children: [] } 
    ]}, 
    { name: "test2", children: [] }, 
]); 

我希望能夠刪除的一個基於屬性值的對象。在其他作品中,我想要做的事情是:

​​

我寫了一個功能,但無法得到它的工作,因爲它尋找「test1child2」作爲一個屬性,而不是價值。

self.removeNavItem = function (itemName) { 
    var item = ko.utils.arrayFirst(self.navItems(), function (item) { 
     if (item.name === itemName) { // this seems to work correctly 
      delete self.navItems[itemName]; // this doesn't, because it tests property, not value 
     } 
    }); 
}; 

jsfiddle link

編輯:

我不知道KO的內置刪除/的removeAll方法。

感謝下面的評論者,我已經部分工作,但是當我嘗試刪除兒童內部的東西時[],它也會刪除整個父代。

removeNavItem = function (itemName) { 
    var items = self.navItems.remove(function (item) { 
     for (i = 0; i < item.children.length; i++) { 
      if (item.children[i].name === itemName) { 
       return item.children[i].name; 
      } 
     } 
     return item.name === itemName; 
    }); 
}; 

updated jsfiddle

回答

1

如果你希望能夠把它用在任何級別,然後傳遞您想從刪除它在數組中:

self.removeNavItem = function (obsArray, itemName) 
{ 
    obsArray.remove(function(item) { return item.name === itemName }); 
}; 

然後就可以調用這個每個元素:

click: function() { $root.removeNavItem($parent.children, $data.name); } 

我已經更新了你的jsfiddle,和它的作品,壽呃,你必須讓所有的孩子數組可觀察數組才能工作。

+0

謝謝! 1我有這個問題,它似乎適用於頂級物品,但沒有第二或第三級物品。 – dmathisen 2013-03-12 15:22:39

+0

你是否指代你的代碼中的兒童數組? – 2013-03-12 15:24:38

+0

是的,確切地說。我想我可以在返回之前使用if(item.children.length> 0){...}來使它工作。我會玩弄它。 – dmathisen 2013-03-12 15:26:50

1

有一個更簡單的方法來做到這一點。淘汰賽提供remove()可以使用函數刪除匹配項:

self.removeNavItem = function (itemName) { 
    var items = self.navItems.remove(function (item) { 
     return item.name === itemName; 
    }); 
}; 

(它是中提到的「刪除和removeall過」在observableArrays documentation部分)

1

我想你會需要一個功能,使遞歸

function del(obj,val){ 
    $.each(obj,function(i,j){ 
     if(j['name'] == val){ 
      delete(j); 
      return false; 
     }else if(j['children'].length!=0){ 
      del(j['children'],val); 
     } 
    }) 

} 

這個函數的n個層上的搜索需要兩個參數的對象和值進行搜索,您可以修改,以適合你的情況。