Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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、reduce和filter从嵌套数组打印_Javascript_Node.js_Arrays - Fatal编程技术网

在javascript中使用map、reduce和filter从嵌套数组打印

在javascript中使用map、reduce和filter从嵌套数组打印,javascript,node.js,arrays,Javascript,Node.js,Arrays,最终目的是为以下数组中的每个名称获取一个。 (与下面代码段底部注释掉的行相似) 如果有相同的名称,则只有计数最大的名称,如果有重复计数,则只有版本更高的名称 我试着用地图的组合,减少。 请帮我解决这个问题 //Original array var arr = [ {'name': 'b', 'version': '103', 'count': 10}, {'name': 'a', 'version': '0.1b', 'count': 73}, {'name': 'b', 've

最终目的是为以下数组中的每个名称获取一个。 (与下面代码段底部注释掉的行相似)

如果有相同的名称,则只有计数最大的名称,如果有重复计数,则只有版本更高的名称

我试着用地图的组合,减少。 请帮我解决这个问题

//Original array
var arr = [
  {'name': 'b', 'version': '103', 'count': 10}, 
  {'name': 'a', 'version': '0.1b', 'count': 73}, 
  {'name': 'b', 'version': '109', 'count': 67}, 
  {'name': 'a', 'version': '1.0.3', 'count': 100}, 
  {'name': 'a', 'version': '2.1.0', 'count': 100}, 
  {'name': 'c', 'version': 'a103', 'count': 30}, 
  {'name': 'c', 'version': 'a111', 'count': 100}
];

//expected console output
// { name: 'a', version: '2.1.0', count: 100 }
// { name: 'b', version: '109', count: 67 }
// { name: 'c', version: 'a111', count: 100 }
首先,作为该过程的“一部分”,我尝试从数组中获取“a”

var filteredArr = arr.filter(item => item.name === 'a');

var m = Math.max(...(filteredArr.map(({count}) => count))),
  maxes = arr.map(({count}) => count).reduce((p,c,i,a) => c ==  m ? p.concat(i) : p,[]);
console.log(maxes);
我希望从上面得到[3,4],但它会打印[3,4,6]

=====

补充问题:

我该如何处理这件事呢?从另一件原作到预期的另一件

//Another original array.
var arr2 = [ 
  { name: 'a', version: '0.1', count: 1 },
  { name: 'b', version: '216', count: 1 },
  { name: 'b', version: '209', count: 1 },
  { name: 'b', version: '216', count: 1 },
  { name: 'b', version: '216', count: 1 },
  { name: 'b', version: '213', count: 1 },
  { name: 'b', version: '213', count: 1 },
  { name: 'b', version: '209', count: 1 },
  { name: 'b', version: '216', count: 1 },
  { name: 'b', version: '216', count: 1 }
];

//expected output
// { name: 'a', version: '0.1', count: 1 },
// { name: 'b', version: '216', count: 5 },
// { name: 'b', version: '209', count: 2 },
// { name: 'b', version: '213', count: 2 }
您可以对对象使用
Array#reduce
,以存储每个名称的对象

var-arr=[
{'name':'b','version':'103','count':10},
{'name':'a','version':'0.1b','count':73},
{'name':'b','version':'109','count':67},
{'name':'a','version':'1.0.3','count':100},
{'name':'a','version':'2.1.0','count':100},
{'name':'c','version':'a103','count':30},
{'name':'c','version':'a111','count':100}
];
const res=Object.values(arr.reduce((acc,{name,version,count})=>{
如果(!acc[name]| | acc[name]&&
(acc[名称]。计数<计数
||acc[name].count==count&&acc[name].version控制台日志(res)
在第二种情况下,您似乎希望为具有相同
名称
版本
的条目聚合
count
属性(类似于
SQL
数据库中的
count
+
groupby
查询)

在这种情况下,您可以首先在第一级计算按
名称
索引的
词典,在第二级计算按
版本
索引的
词典:

dictionary\u res=arr2.reduce((acc,{name,version,count})=>{
如果(!acc[名称]| |(acc[名称]&&&&!acc[名称][版本]){
acc[名称]=acc[名称]| |{}
acc[名称][版本]={count:count}
}否则{
acc[名称][版本]['count']=acc[名称][版本]['count']+count
}
返回acc
}, {})
dictionary\u res
生成的值非常接近您想要的值:

{
a:{0.1':{count:1}},
b:
{'209':{count:2},'213':{count:2},'216':{count:5}
}
但是,您仍然需要将其转化为一个阵列,以完全实现您想要的:

array\u res=Object.keys(dictionary\u res).reduce((acc,name)=>{
Object.keys(dictionary_res[name]).forEach((版本)=>(
acc.push({name,version,count:dictionary_res[name][version][count']})
))
返回acc
}, [])
array\u res
现在生成预期值:

[{name:'a',version:'0.1',count:1},
{名称:'b',版本:'209',计数:2},
{名称:'b',版本:'213',计数:2},
{名称:'b',版本:'216',计数:5}]

显示您尝试的代码以及失败的原因当版本值不可预测时,您对更高版本的定义是什么?runnable snippet和console.log可以帮助您实现预期的输出[3,4],但决不能代表您上述的规则。请解释输出/代码与您制定的规则之间的关系。@kienhtt只需比较版本,因为ascii就足够了!棒 极 了实际上,我需要将第二个案例的结果(您的答案)输入到第一个案例中。谢谢,不客气。很高兴听到这个消息