2

私は KnockoutJS を使用しており、多次元の観測可能な配列 (オブジェクト?) を持っています。

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

プロパティ値に基づいて、オブジェクトの 1 つを削除できるようにしたいと考えています。他の作品では、次のようなことをしたいと思っています。

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 リンク

編集:

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

更新されたjsfiddle

4

3 に答える 3

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

 }

この関数は、オブジェクトと検索する値の2つの引数を取り、ケースに合わせて変更できます。

于 2013-03-12T15:21:28.433 に答える
1

任意のレベルで使用できるようにする場合は、削除する配列を渡します。

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

次に、各要素でこれを呼び出すことができます。

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

jsfiddleを更新しましたが、動作しますが、動作させるにはすべての子配列を監視可能な配列にする必要があります。

于 2013-03-12T15:08:51.023 に答える
1

これを行う簡単な方法があります。Knockout はremove()、関数を使用して一致するアイテムを削除できる を提供します。

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

( observableArrays ドキュメントの「Remove and RemoveAll」セクションに記載されています)

于 2013-03-12T15:13:15.687 に答える