Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从javascript数组.map()回调中排除某些元素_Javascript_Arrays - Fatal编程技术网

如何从javascript数组.map()回调中排除某些元素

如何从javascript数组.map()回调中排除某些元素,javascript,arrays,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数组包含产品类别的唯一列表 我觉得应该有更好的方法来做这件事,但我什么也

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

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);
}
var类别=[];
var products=//产品对象的某些数组
对于(变量i=0;i
对于坚持认为这是“如何使阵列独特”问题的重复的人,请更新。我看到了那个帖子,就我的情况而言,我认为它不适用。I没有需要使其唯一的值数组。我有一个对象数组,我需要构建一个唯一值数组。区别可能很微妙——但为了了解该主题的用例,我将构建一个非唯一数组,然后使其唯一。似乎比我原来的解决方案更糟糕更新:一个具有

var products=[{Name:'牛奶',价格:2.50,类别:'杂货'},{Name:'衬衫',价格:10,类别:'服装'},{Name:'苹果',价格:5,类别:'杂货'},
类别=产品。减少(功能(r,a){
if(!~r.indexOf(a.Category)){
r、 推(a类);
}
返回r;
}, []);

document.write(''+JSON.stringify(categories,0,4)+'')按照下面的答案进行操作:

var flags=[],output=[],l=array.length,i;

对于(i=0;i您可以使用
reduce
而不是
map

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" ]
首先输出对象类别的所有值,然后使用以处理重复项


可能重复的请添加一些样本数据。我是@NinaScholzi think,你误用
map
进行简单的迭代。正确的方法是
forEach
@Andy-Bek的答案的值是指出我可以使用reduce()构建数组;与生成标量相反。Bek的答案中有一些编辑;因此,可能错误已经修复——或者可能是我得到了想法并正确地实现了它。无论如何,它工作得很好!我认为这不起作用——在
过滤器中
类别始终是一个空数组,比较将始终返回true。或者是我误解?请提供一些示例数据,它更有可能看到您想要的。@Felix此答案显示了如何实现问题询问(函数式与命令式过滤值),但这不是您实际需要的,重复Vankat发现完美的答案。产品=[{名称:'牛奶',价格:2.50,类别:'杂货'},{名称:'衬衫',价格:10,类别:'服装'},{名称:'苹果',价格:5,类别:'杂货'}]预期结果:类别=['杂货','服装']@Felix,在将来,可能不会认为这是一场竞赛。Bex可能首先回答了wrt
reduce
,但答案很差/没有检查。reduce将给我一个值(例如,sum)。我需要一个值数组(例如,Categories)它不是一个单一的值,它是一个数组,在数组中积累了很多东西哇!还没有想过以这种方式使用reduce!标记为answerit会重写产品。类别没有定义。整个对象都是推式的。indexof对对象不起作用。我的目的是展示如何使用
reduce
,而不是解决特定的问题 it@NinaScholz,它是不是说要避免indexOf?
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;
}, []);
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" ]