ES6 将一个数组的元素归约成一个数组,其元素出现的频率

ES6 reduce elements of an array into an array of the frequency of occurence of its elements

我有一个数组,其中包含字符串中以逗号分隔的数字,示例数组如下所示

const arr = ["2", "1,2", "2,3", "1,3"]

我想创建另一个数组,其中包含这些值出现频率的总和。

这是我要实现的算法

  1. 通过具有累加器数组的缩减器循环遍历每个元素
  2. 拆分每个元素并将它们转换为数字数组
  3. 如果累加器索引为空,则将其初始化为零,否则加 1 到预先存在的值

这是代码,我正在尝试

arr.reduce((acc, item) => { 
item.split(",").map((value, index) => {
    val = parseInt(value) 
    acc[val] === null ? acc[val] = 0 : acc[val] += 1 
  })
})

我得到一个错误Uncaught TypeError: Cannot read property 2 of undefined

const arr = ["2", "1,2", "2,3", "1,3"]
var count = {};
arr.reduce((acc, item) => { 
    item.split(",").map((value, index) => {

       if(value in acc) acc[value]++;
       else acc[value] = 1

     })

     return acc;
},count);

结果是这样的对象 {1: 2, 2: 3, 3: 2}

你必须为accumulator also I suggest that you use .forEach()提供一个默认值,而不是使用.map()map()函数来生成一个新的数组,这里你只是想遍历数组,还有一件事,你必须在每次迭代时 return accumulator

const arr = ["2", "1,2", "2,3", "1,3"];

let newArr = arr.reduce((acc, item) => {
  item.split(",").forEach((value, index) => {
    val = parseInt(value);
    acc[val] === undefined ? (acc[val] = 0) : (acc[val] += 1);
  });
  return acc;
}, {});

console.log(newArr);

虽然您可以使用地图,但那是为了从现有数组构建新数组。尽管您可以使用 reducer,但这意味着增量计算累加器。由于您所做的只是循环遍历拆分值,因此您不需要使用地图,并且由于您 变异 最终结果而不是计算它,您可能想要考虑使用性能更高的循环机制来减少您不需要的工作:

const acc = {};
for (const item of arr) {
  for (const value of item.split(",")) {
    val = parseInt(value) 
    acc[val] === null ? acc[val] = 0 : acc[val] += 1 
  }
}

我发现了几个问题。

  1. 您没有提供初始累加器。
  2. acc[val] 第一次会是 undefined 而不是 null
  3. 你需要return下一次迭代的累加器

所以

const arr = ["2", "1,2", "2,3", "1,3"]

const results = arr.reduce((acc, item) => {
  item.split(",").map((value, index) => {
    val = parseInt(value)
    acc[val] === undefined ? acc[val] = 0 : acc[val] += 1
  })
  return acc;
}, {})

console.log(results);