根据属性值从多维Javascript数组中删除项目

时间:2013-03-12 15:05:21

标签: javascript arrays knockout.js

我正在使用KnockoutJS并拥有一个多维可观察数组(对象?):

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

我希望能够根据属性值删除其中一个对象。在其他作品中,我想做一些事情:

removeNavItem("test1child2");

我已经编写了一个函数但无法使其工作,因为它正在寻找'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内置的remove / 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

3 个答案:

答案 0 :(得分:1)

如果您希望能够在任何级别上使用它,请传入要从中删除它的数组:

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

然后你可以在每个元素上调用它:

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

我已经更新了你的jsfiddle,虽然你必须让所有子数组都有可观察的数组才能工作。

答案 1 :(得分:1)

有一种更简单的方法可以做到这一点。 Knockout提供remove(),可以使用函数删除匹配项:

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

(在observableArrays documentation的'删除和删除所有'部分中提到了

答案 2 :(得分:1)

我认为你需要一个能够在n级递归上搜索的函数

 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);
         }
   })

 }

这个函数接受你的对象和搜索值的两个参数,你可以修改它以适合你的情况。