Я использую KnockoutJS и имею многомерный массив наблюдаемого объекта (?):Удаления элемента из массива многомерного Javascript, основанные на стоимости недвижимости
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
}
});
};
EDIT:
Я не знал о встроенных в отдалении/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;
});
};
Спасибо! 1 проблема у меня с этим, что она работает для элементов верхнего уровня, но не для второго или третьего уровня. – dmathisen
Вы имеете в виду массив детей в вашем коде? –
Да, точно. Я думаю, что я смогу использовать if (item.children.length> 0) {...} перед возвратом, чтобы заставить его работать. Я поиграю с этим. – dmathisen