在JavaScript中从1D数组创建2D数组

时间:2020-09-28 23:32:03

标签: javascript arrays multidimensional-array

我有以下数组:

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]]

执行此操作的最佳方法是什么?数字数组可以包含各种元素,因此计数器数组中的元素数量可以变化。

4 个答案:

答案 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支持

的常见 entries 格式,因此可以进行数组转换
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);