我有以下数组:
let numbers = [10, 20, 20, 10, 10, 30, 50, 10, 20];
我创建了一个没有重复值的新数组:
let counter = [...new Set(array)];
//Output: [ 10, 20, 30, 50 ]
我想将计数器数组实例化为2D /嵌套数组,使其看起来像这样:
//counter output: [[10,4][20, 3][30, 1][50,1]]
执行此操作的最佳方法是什么?数字数组可以包含各种元素,因此计数器数组中的元素数量可以变化。
答案 0 :(得分:3)
此答案是针对原始问题(如何从集合中创建[[10, 0],[20, 0],[30, 0],[50, 0]]
的数组):
使用Array.from()
来创建成对数组,而不是散布Set:
const numbers = [10, 20, 20, 10, 10, 30, 50, 10, 20];
const counter = Array.from(new Set(numbers), v => [v, 0]);
console.log(counter);
答案 1 :(得分:2)
假设您实际上希望第二个子数组索引代表每个数字的出现次数(:现在已确认),则可以将计数收集到Map
中,然后将其转换为数组
nprocs
由于let numbers = [10, 20, 20, 10, 10, 30, 50, 10, 20];
const counter = [...numbers.reduce((map, n) =>
map.set(n, (map.get(n) ?? 0) + 1), new Map())]
console.info(JSON.stringify(counter)) // stringifying so it's all on one line
支持
Map
并使用传播语法将其隐式转换为 entries 数组。
答案 2 :(得分:0)
一种方法是采用您已经使用过的想法,并在这些值之间进行映射,以返回带有值和附加零的新数组。
let numbers = [...new Set([10, 20, 20, 10, 10, 30, 50, 10, 20])].map(value=>[value,0]);
答案 3 :(得分:0)
您可以将原始数组转换为对象(哈希图)以跟踪计数。然后将其转换为Object.entries()
数组。
const numbers = [10, 20, 20, 10, 10, 30, 50, 10, 20];
let obj = {};
numbers.forEach(n => {
obj[n] = obj[n] || 0;
obj[n]++;
});
const counter = Object.entries(obj).map(e => [+e[0], e[1]]);
console.log(counter);