2017-04-10 1 views
0

この配列内で配列と配列をフィルタリングする必要があります。2つの配列のJavaScriptフィルタ

arr: [ 
    { 
     name: 'object', 
     array2: [ 
     { 
      name: '1' 
     }, 
     { 
      name: '2' 
     } 
     ] 
    }, 
    { 
     name: 'object 2', 
     array2: [ 
     { 
      name: 'object' 
     } 
     ] 
    } 
] 

私はフィルタに値2を入力して、私がここに持っているしたいと出力は、ある - -

arr: [ 
    { 
     name: 'object', 
     array2: [ 
     { 
      name: '2' 
     } 
     ] 
    }, 
    { 
     name: 'object 2', 
     array2: [] 
    } 
] 

私が持っている

そこで、我々は配列を持っていますこれは外部レベル(最初のレベルではnameとarray2のパラメータを持つオブジェクトがあります)で動作します。内側のレベルも機能しますが、内側のレベルをフィルタリングすると内側のオブジェクトの初期状態を取り戻すことができないという問題があります。私は入力バーを持っていますが、2を入力するときれいにフィルタリングされますが、2を削除するとarr:[]の他の要素が表示されますが、array2のフィルタリングされた要素は表示されません。

これを修正する方法についてのご意見はありますか?

jsFiddleへのリンク:http://jsbin.com/pupugoxebi/edit?html,js,output

私は新しい配列を手動でプッシュしますが、動的アレイがあるためにこれは機能しません。たとえば、別のプロパティを持つことができます。手動で書き込むと解決しません。更新版 - http://jsbin.com/bifolisefu/edit?html,js,output

+0

だけでなく、あなたのコードと希望の結果を追加してください。あなたもここで見ているかもしれません:[mcve] –

+0

完了。 jsFiddleへのリンクを追加しました+私が期待したもののコメントですが、私が得たものです。例えば3で最初にフィルターをかけると、うまくいきますが、3を削除して他のものにフィルターをかけると、それはもう機能しません。 –

答えて

1

あなたは、新しいオブジェクトを構築し、結果セットにそれをCONCAT、外側の列の名前をCECKのいずれかを使用するか、内側の配列は、いくつかの項目を返すかどうかを確認できます。

function getNodes(array, name) { 
 
    return array.reduce(function (r, a) { 
 
     var temp = a.array2.filter(b => b.name.includes(name)); 
 
     return r.concat(
 
      a.name.includes(name) || temp.length ? 
 
      Object.assign({}, a, { array2: temp }) : 
 
      [] 
 
     ); 
 
    }, []); 
 
} 
 

 
var array = [{ name: 'test', foo: 0, array2: [{ name: 'test 2', foo: 1 }, { name: 'test 3', foo: 2 }] }, { name: 'test 2', foo: 3, array2: [{ name: 'test', foo: 4 }] }, { name: 'test 3', foo: 5, array2: [{ name: 'test 4', foo: 6 }, { name: 'test 5', foo: 7 }] }]; 
 

 
console.log(getNodes(array, '2')); 
 
console.log(getNodes(array, '3')); 
 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

を見ることができますこれは動作しません、私は動的配列を作成することができないため、これの原因は既知の量を持っていないということですプロパティとプロパティ名の私は指定されたonylを知っていますが、他の人もいるかもしれません - それは動的に作成されます。したがって、たとえばotherValue、経度、緯度などのプロパティも存在する可能性があります。つまり、arrayとarray2は多くのプロパティ(動的プロパティ)で動的に作成され、フィルタリングする必要があるプロパティのみがわかります。 –

+0

私はそれを['Object.assign'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)で動的アプローチに変更しました。 –

+0

ちょうどそれが連結なしでそれをすることは可能かどうか疑問に思っていますか?そして、2つのフィルタだけを使用しますか? Liek here - http://jsbin.com/yadifeboto/edit?html,js,output。原因は、typescriptとcraetingカスタム・タイプを使用していることです。また、concatが存在しない複数のタイプがあります。いいえ、それはいいです。 –

0

次のコードを試してください。

var arr2 = [ 
 
    { 
 
    name: 'test', 
 
    array2: [ 
 
     { 
 
     name: 'test 2' 
 
     }, 
 
     { 
 
     name: 'test 3' 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    name: 'test 2', 
 
    array2: [ 
 
     { 
 
     name: 'test' 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    name: 'test 3', 
 
    array2: [ 
 
     { 
 
     name: 'test 4' 
 
     }, 
 
     { 
 
     name: 'test 5' 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
arr2.map(e => { 
 
    var tmp = e.array2.filter(e2 => e2.name.includes('2')); 
 
    e.array2 = tmp; 
 
}); 
 

 
console.log(arr2);

+0

これは機能しません。テキストに基づいて大きな配列をフィルタリングしません。 –

+0

それはどういう意味ですか?答えの構造はあなたの仕様に合っていませんか? –

+0

いいえ、残念ながら、そうではありません。期待される配列は { "名前": "テスト3"、 "配列2":[] } オブジェクトなしであるでしょう。 –

関連する問題