как исключить некоторые элементы из массива JavaScript.обратный вызов map()

по сути, я хочу реализовать следующие:

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);
}

обновление для тех, кто настаивает, что это дубликат "как сделать массив уникальный" вопрос. Я видел этот пост, и для моей ситуации я не думаю, что это относится. Я!--17-->не есть массив значений, который нужно сделать уникальным. У меня есть массив объектов, и мне нужно построить массив уникальных значений. Разница может быть тонкой , но чтобы добраться до варианта использования этой темы, я бы построил не уникальный массив, а затем сделал его уникальным. Кажется, даже хуже, чем мое первоначальное решение

4 ответов


можно использовать 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;
}, []);

Update: решение с Array.prototype.reduce()

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>');

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" ]

демо


следуйте приведенному ниже ответу:

как получить уникальные значения из массива объектов в 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);
}