2016-03-04 73 views
0
提取物項目

我只是在尋找一個好辦法做到這一點:使用Javascript - 從陣列基於ID過濾創建2個陣列

我有2列:

var allItems = [ 
      {'id' : '1', 'title' : 'Title 1' }, 
      {'id' : '2', 'title' : 'Title 2' }, 
      {'id' : '3', 'title' : 'Title 3' }, 
      {'id' : '4', 'title' : 'Title 4' }, 
      {'id' : '5', 'title' : 'Title 5'}, 
      {'id' : '6', 'title' : 'Title 6' } 
     ]; 

    var idsToExtract = ['1', '3', '6']; 

我要尋找的結果與兩個陣列看起來像這樣:

var array1 = [ 
      {'id' : '1', 'title' : 'Title 1' }, 
      {'id' : '3', 'title' : 'Title 3' }, 
      {'id' : '6', 'title' : 'Title 6'} 
     ]; 

    var array2 = [ 
      {'id' : '2', 'title' : 'Title 2' }, 
      {'id' : '4', 'title' : 'Title 4' }, 
      {'id' : '5', 'title' : 'Title 5'} 
     ]; 

我只使用天然JS(ES2015)陣列方法(地圖/過濾器等)。

沒有jquery /下劃線等

謝謝!

回答

3

Array.prototype.filter()method可以幫助您:

var allItems = [ 
      {'id' : '1', 'title' : 'Title 1' }, 
      {'id' : '2', 'title' : 'Title 2' }, 
      {'id' : '3', 'title' : 'Title 3' }, 
      {'id' : '4', 'title' : 'Title 4' }, 
      {'id' : '5', 'title' : 'Title 5'}, 
      {'id' : '6', 'title' : 'Title 6' } 
     ]; 

var idsToExtract = ['1', '3', '6']; 

var array1 = allItems.filter(function(item) { 
    return idsToExtract.indexOf(item.id) !== -1; 
}); 

var array2 = allItems.filter(function(item) { 
    return idsToExtract.indexOf(item.id) === -1; 
}); 

當然你也可以使用Array.prototype.foreach()method,並創建2個陣列在一個迭代週期:

var allItems = [ 
      {'id' : '1', 'title' : 'Title 1' }, 
      {'id' : '2', 'title' : 'Title 2' }, 
      {'id' : '3', 'title' : 'Title 3' }, 
      {'id' : '4', 'title' : 'Title 4' }, 
      {'id' : '5', 'title' : 'Title 5'}, 
      {'id' : '6', 'title' : 'Title 6' } 
     ]; 

var idsToExtract = ['1', '3', '6'], 
    array1 = [], 
    array2 = []; 

allItems.forEach(function(item) { 
    idsToExtract.indexOf(item.id) !== -1 ? array1.push(item) : array2.push(item); 
}); 
+0

謝謝!完美 – 29er

+0

@ 29er很高興幫助。 –

1

使用Array.prototype.filter()

var array1 = allItems.filter((x) => idsToExtract.includes(x.id)); 
var array2 = allItems.filter((x) => !idsToExtract.includes(x.id)); 

的jsfiddle:https://jsfiddle.net/ykcdvp9v/1/

+0

更好用Es6 :) thx – 29er

+0

@ 29er是的,ES6真的使一個內襯乾淨,有趣! – Cymen

+0

ES2015 ['includes()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)。使用它... – Amit

0

使用簡單的for循環

var allItems = [ 
      {'id' : '1', 'title' : 'Title 1' }, 
      {'id' : '2', 'title' : 'Title 2' }, 
      {'id' : '3', 'title' : 'Title 3' }, 
      {'id' : '4', 'title' : 'Title 4' }, 
      {'id' : '5', 'title' : 'Title 5'}, 
      {'id' : '6', 'title' : 'Title 6' } 
     ]; 

var idsToExtract = ['1', '3', '6'], 

    var remainingItemsArray= []; 
    var extractedItemsArray= []; 
    for(var i=0;i<allItems.length;i++){ 
      var item = allItems[i]; 
      if(idsToExtract.indexOf(item.id) != -1){ 
       remainingItemsArray.push(item); 
      }else{ 
       extractedItemsArray.push(item); 
      }   
    }