如何从javascript Array.map()回调中排除一些元素

时间:2015-12-25 19:59:39

标签: javascript arrays

基本上,我想实现以下内容:

var categories = [];
var products = // some array of product objects
products.map(function(value) {
   if(categories.indexOf(value.Category === -1)) categories.push(value.Category);
});

因此,categories数组包含唯一的产品类别列表。

感觉应该有更好的方法来做到这一点,但没有想到任何事情。

如果不是那么可能首先没有必要使用map()。我可以像

一样简单
var categories = [];
var products = // some array of product objects
for (var i = 0; i < products.length; i++) {
   if(categories.indexOf(products[i].Category === -1)) categories.push(products[i].Category);
}

对于那些坚持认为它是“如何使阵列独一无二”的副本的更新&#34;题。我看到那个帖子,根据我的情况,我认为它不适用。我拥有一系列值,我需要使其独一无二。我有一个对象数组,我需要构建一组唯一值。差异可能很微妙 - 但是要了解该主题的用例,我将构建一个非唯一的数组,然后使其唯一。似乎比我原来的解决方案更糟糕

4 个答案:

答案 0 :(得分:6)

更新:Array.prototype.reduce()

的解决方案

&#13;
&#13;
var products = [{ Name: 'milk', price: 2.50, Category: 'groceries' }, { Name: 'shirt', price: 10, Category: 'clothing' }, { Name: 'apples', price: 5, Category: 'groceries' }],
    categories = products.reduce(function (r, a) {
        if (!~r.indexOf(a.Category)) {
            r.push(a.Category);
        }
        return r;
    }, []);

document.write('<pre>' + JSON.stringify(categories, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 1 :(得分:5)

您可以使用reduce代替map

var products = [{Category:'vegetable', price: 1}, {Category:'fruits', price: 2}];
var categories = products.reduce(function(sum, product) {
 if(sum.indexOf(product.Category) === -1){
  sum.push(product.Category);
 }
 return sum;
}, []);

答案 2 :(得分:2)

map首先输出对象类别的所有值,然后使用filter处理重复项。

var products = [
  { category: 'A' },
  { category: 'B' },
  { category: 'A' },
  { category: 'D' }
];

var categories = products.map(function (e) {
  return e.category;
}).filter(function (e, i, a) {
  return a.indexOf(e) === i;
}); // [ "A", "B", "D" ]

DEMO

答案 3 :(得分:0)

按照下面的SO答案:

How to get distinct values from an array of objects in JavaScript?

var flags = [], output = [], l = array.length, i;
for( i=0; i<l; i++) {
    if( flags[array[i].age]) continue;
    flags[array[i].age] = true;
    output.push(array[i].age);
}