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 到预先存在的值
这是代码,我正在尝试
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
}
}
我发现了几个问题。
- 您没有提供初始累加器。
acc[val]
第一次会是 undefined
而不是 null
。
- 你需要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);
我有一个数组,其中包含字符串中以逗号分隔的数字,示例数组如下所示
const arr = ["2", "1,2", "2,3", "1,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
}
}
我发现了几个问题。
- 您没有提供初始累加器。
acc[val]
第一次会是undefined
而不是null
。- 你需要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);