JavaScript中创建一个带有键的空二维数组

7
我正在尝试在Javascript中创建一个矩阵,其中X和Y轴具有预定义的键。
例如,我有以下键:
const x = [2,4,6,8]
const y = [10,20,40,60,80]

我找到了以下代码片段,它创建了一个4行5列的空二维数组。
[...Array(4)].map(x=>Array(5).fill(0))       

我想知道是否可以使用提供的键来创建这些数组(对象)。
最终结果应该是这样的。
{
    2 => {10 => 0, 20 => 0, 40 => 0, 60 => 0, 80 => 0}
    4 => {10 => 0, 20 => 0, 40 => 0, 60 => 0, 80 => 0}
    6 => {10 => 0, 20 => 0, 40 => 0, 60 => 0, 80 => 0}
    8 => {10 => 0, 20 => 0, 40 => 0, 60 => 0, 80 => 0}
}

2
为什么不取一个对象呢? - Nina Scholz
好的,从技术上讲,它将是一个对象,因为在js中不存在关联数组。我会进行编辑。 - Miguel Stevens
不要使用 Array(5).fill(0),尝试使用 Array.from( {length: 5}, () => 0 ) - Rajesh
你是否正在尝试创建一个稀疏矩阵?显然,有现成的JS库可以处理稀疏矩阵,例如math.js - stop-cran
@stop-cran 不,这只是为了尝试创建可编辑的网格作为表单。 - Miguel Stevens
4个回答

5

你可以通过循环和减少数据来创建所需的对象。

Array#reduce 的回调函数将累加器(即一个对象)作为第一个参数,数组中正在迭代的值作为第二个参数。

使用reducestartValue需要一个(类似空的)对象,并且使用该对象添加属性。为了使这个对象(即累加器)准备好下一次循环(和最终结果),必须返回该对象。

var x = [2, 4, 6, 8],
    y = [10, 20, 40, 60, 80],
    result = x.reduce((r, k) => {
        r[k] = y.reduce((q, l) => {
            q[l] = 0;
            return q;
        }, {});
        return r;
    }, {});

console.log(result);


谢谢,我收到了一个警告:“箭头函数不应该返回赋值”。有解决方法吗? - Miguel Stevens

4

您可以使用 map 方法来获取 y 数组中每个元素对应的 row 对象。使用 Object.fromEntries() 方法将这些元素转换为对象。接着,再使用 map 方法来获取 x 数组中每个元素对应的输出对象,并将每个 row 对象复制到该输出对象的值中。

const x = [2, 4, 6, 8],
      y = [10, 20, 40, 60, 80],
      row = Object.fromEntries( y.map(v => [v, 0]) ),
      output = Object.fromEntries( x.map(key => [key, { ...row }]) )

console.log(output)

需要克隆是因为如果修改其中一行,其他值也会更新,因为它们都指向同一个引用


3
你可以尝试以下方法:
  • 由于重复的子对象相同,请首先创建它。
  • 现在循环父键并使用扩展或Object.assign,将其设置为对象。

这样可以减少迭代次数,代码看起来更清晰。

const x = [2,4,6,8]
const y = [10,20,40,60,80]

const innerObj = y.reduce((acc, item) => {
  acc[ item ] = 0;
  return acc;
}, {});

const result = x.reduce((acc, item) => {
  acc[ item ] = { ...innerObj };
  return acc;
}, {});

console.log(result)


2
你可以使用 forEach 循环:

const x = [2, 4, 6, 8]
const y = [10, 20, 40, 60, 80];

let results = {};
x.forEach(k => {
  let inner = {};
 
  y.forEach(v => inner[v] = 0);
  results[k] = inner;
});

console.log(results);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接