0

私はノックアウトを使用しており、arrayFilter を使用して、別の配列内で「変更された」プロパティの値が true であるオブジェクトの配列を返したいと考えています。

つまり、私のjsonオブジェクトは次のようになります

Family tree
Family{
  LastName=Smith
  Children{
    Name=bob,
    Modified=false},
   {
    Name=tom, Modified=true}
 }
Family{
  LastName=Jones
  Children{
    Name=bruno,
    Modified=false},
   {
    Name=mary, Modified=false}
 }

子 tom has modified =true のため、配列フィルタの結果は次のようになります。

FamilyTree
  Family{
  LastName=Smith
  Children{
    Name=bob,
    Modified=false},
   {
    Name=tom, Modified=true}
 }

これは可能ですか?

4

2 に答える 2

4

@ pax162 が提供したソリューションがおそらくあなたの質問に答えると思います。ただし、使い方の問題があります。提案されたソリューションは、ネストされた反復を実行します。データを 1 回だけ処理することを期待している場合 (一部のリッチ クライアント ビューを駆動するのではなく)、これが取るべきアプローチです。一方、このデータをビューにバインドする場合は、より KO に似た別のアプローチを検討できます。これが私が考えていることです:

var family = function(data){
    var self = {
        LastName :ko.observable(data.LastName),
        Children : ko.observableArray( data.Children || [])
    };

    family.hasModifiedChildren = ko.computed(function() {
        return ko.utils.arrayFirst(this.Children(), 
            function(child) {
                return child.Modified === true;
            }) !== null;
    }, family);

    return self;
}

JSON データを使用するのではなく、監視可能な JS オブジェクトを作成します。

var families = return ko.utils.arrayMap(familiesJson, family);
// or, if you need an observable:
families = ko.observableArray(ko.utils.arrayMap(familiesJson, family));

最後に、次のように変更された子供を持つ家族のリストを取得します。

var familiesWithModifiedChildren = ko.computed(function() { 
    return ko.utils.arrayFilter(families, function(fam) {
        return fam.hasModifiedChildren();
    });
});

ライブ更新ページを作成している場合は、このスタイルのビュー モデルを使用することをお勧めします。これにより、Knockout は、関数が評価されるたびに新しい配列を構築するのではなく、オブザーバーの最適化を利用できるようになります。お役に立てれば!

于 2013-10-31T16:13:47.273 に答える
1

変更された子が少なくとも 1 人いる家族のみを取得する場合は、これを行うことができます ( http://jsfiddle.net/MAyNn/3/ )。json が有効ではありませんでした。少し変更しました。

 var families = [
{
    LastName :"Smith",
    Children : [{
    Name:"bob",
    Modified:false},
   {
       Name:"tom", Modified :true}
 ]
},
{
    LastName :"Jones",
    Children : [{
    Name:"bruno",
    Modified:false},
   {
       Name:"mary", Modified :false}
 ]
}   
 ];

var filteredFamilies = ko.utils.arrayFilter(families, function(family){
    var hasModified = false;
    var first = ko.utils.arrayFirst(family.Children, function(child){
        return child.Modified;
    })
    if (first) {
        hasModified = true;
    }

    return hasModified;
})

console.log(families);
console.log(filteredFamilies);
于 2013-10-31T15:28:49.930 に答える