繁体   English   中英

在 JavaScript 中从一维数组创建二维数组

[英]Creating a 2D array from a 1D array in JavaScript

我有以下数组:

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

做到这一点的最佳方法是什么? 数字数组可能有各种元素,因此计数器数组中的元素数量可能会有所不同。

此答案适用于原始问题(如何从 Set 创建[[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);

假设您实际上希望第二个子数组索引表示每个数字的出现次数( ed:confirmed now ),您可以将计数收集到Map ,然后将其转换为数组

 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支持常见的条目格式

[ [ key, value ], [ key, value ], ... ]

并使用扩展语法将其隐式转换为条目数组。

一种方法是采用您已经使用过的想法并映射这些值,返回带有该值和附加零的新数组。

let numbers = [...new Set([10, 20, 20, 10, 10, 30, 50, 10, 20])].map(value=>[value,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);

暂无
暂无

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

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