基本上,我想实现以下内容:
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;题。我看到那个帖子,根据我的情况,我认为它不适用。我不拥有一系列值,我需要使其独一无二。我有一个对象数组,我需要构建一组唯一值。差异可能很微妙 - 但是要了解该主题的用例,我将构建一个非唯一的数组,然后使其唯一。似乎比我原来的解决方案更糟糕
答案 0 :(得分:6)
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;
答案 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" ]
答案 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);
}