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

标签 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 方法。

感谢下面的评论者,我已经部分工作了,但是当我尝试删除 Children[] 内部的某些内容时,它也会删除整个父级。

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

最佳答案

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

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

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

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

我已经更新了您的jsfiddle ,并且它可以工作,尽管您必须将所有子数组设置为可观察数组才能工作。

关于javascript - 根据属性值从多维 Javascript 数组中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15364838/

相关文章:

javascript - 如何使用jspdf在多页pdf中保存图像

javascript - Nuxt 3 包导入说明符 "#internal/nitro"未定义

mysql - PHP 关联数组 : special character?

knockout.js - 使用 knockout 绑定(bind)更改 select 上的事件,我如何知道它是否是真正的更改?

javascript - 使用 Knockout 克隆具有可观察数组的对象

javascript - 具有函数 : how to pass to function another parameter? 的 Lodash map

javascript - get 方法工作,但不是 post - ZapWorks Studio

javascript - JS 对象数组 - 删除重复项并合并嵌套对象

javascript - RxJS:带有数组的JSON数据,进一步处理流中的每个项目

javascript - 使用 Knockout JS 将多个不同的 JSON 源映射到一个 View 模型