Javascript - 从基于id过滤器的数组中提取项目以创建2个数组

时间:2016-03-04 06:39:10

标签: javascript

我只是想找到一个好方法:

我有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)数组方法。(map / filter等)。

没有jquery / undercore等。

谢谢!

3 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分: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/

答案 2 :(得分: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);
            }        
    }