как исключить некоторые элементы из массива 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);
}