繁体   English   中英

使用 map 从嵌套数组打印,在 javascript 中减少和过滤

[英]Print from nested array using map, reduce and filter in javascript

最终目的是为以下数组中的每个名称获取一个。 (就像下面片段底部的注释行)

如果有相同的名字,只有最大的一个,如果有重复的,只有一个更高版本的。

我尝试使用map的组合,减少。 请帮我解决这个问题。

//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和 object 来存储每个名称的 object。

 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})=>{ if(.acc[name] || acc[name] && (acc[name].count < count || acc[name].count === count && acc[name],version < version)){ acc[name] = {name, version; count}; } return acc, }; {})). console;log(res);

在第二种情况下,您似乎想要为具有相同nameversion的条目聚合count属性(类似于SQL数据库中的COUNT + GROUP BY查询)。

在这种情况下,您可以首先在第一级计算按name索引的dictionary_res ,在第二级按version索引:

dictionary_res = arr2.reduce((acc, { name, version, count }) => {
  if (!acc[name] || (acc[name] && !acc[name][version])) {
    acc[name] = acc[name] || {}
    acc[name][version] = { count: count }
  } else {
    acc[name][version]['count'] = acc[name][version]['count'] + count
  }
  return acc
}, {})

dictionary_res产生的值非常接近您想要的值:

{
  a: { '0.1': { count: 1 } },
  b:
  { '209': { count: 2 }, '213': { count: 2 }, '216': { count: 5 } }
}

但是,您仍然需要将其转换为数组以完全实现您想要的:

array_res = Object.keys(dictionary_res).reduce((acc, name) => {
  Object.keys(dictionary_res[name]).forEach((version) => (
    acc.push({ name, version, count: dictionary_res[name][version]['count'] })
  ))
  return acc
}, [])

array_res现在产生预期值:

[ { name: 'a', version: '0.1', count: 1 },
  { name: 'b', version: '209', count: 2 },
  { name: 'b', version: '213', count: 2 },
  { name: 'b', version: '216', count: 5 } ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM