我正在使用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
}
});
};
修改
我不知道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;
});
};
答案 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);
}
})
}
这个函数接受你的对象和搜索值的两个参数,你可以修改它以适合你的情况。