2017-04-10 86 views
0

所以我需要在這個數組中過濾數組和數組。Javascript filter two arrays

所以,我們有一個數組 -

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: [] 
    } 
] 

我有匹配邏輯在這裏,它在外層(第一層,我有一個名稱和array2參數的對象)的作品。內層也行得通,但問題在於,如果我過濾內層,我無法取回內層對象的初始狀態,也就是說。我有一個輸入欄,如果我輸入2,它過濾得很好,但是,如果我刪除2,它會顯示來自arr:[]的其他元素,但不會顯示來自array2:[]的過濾元素。

有關如何解決此問題的任何想法?

鏈接到jsFiddle的評論 - http://jsbin.com/pupugoxebi/edit?html,js,output

我coudl手動推新陣列,但這不起作用,因爲我有動態數組,例如,它可以有不同的屬性,手動寫入不會解決它。更新版本 - http://jsbin.com/bifolisefu/edit?html,js,output

+0

請添加您的代碼和通緝的結果也是如此。你也可以在這裏看看:[mcve] –

+0

完成。添加了jsFiddle的鏈接+評論我的預期,但我得到了什麼。例如,如果我們第一次過濾3,例如,它工作得很好,但是如果我們刪除3並在其他方面過濾 - 它不再工作。 –

回答

1

您可以使用任一ceck的外部陣列的名稱,或檢查內部數組返回一些項目,再建一個新的對象,並將其Concat的結果集。

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

只是想知道是否有可能沒有concat做到這一點?只使用兩個過濾器?在這裏傾訴 - 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

不,不幸的是,沒有。期望的陣列將沒有 {name}:「test 3」, 「array2」:[] } object。 –