【问题标题】:Create an empty two dimensional array in Javascript, with keys在Javascript中创建一个空的二维数组,带有键
【发布时间】:2019-11-14 10:02:36
【问题描述】:

我正在尝试在 Javascript 中创建一个矩阵,但它具有预定义的 X 和 Y 轴键。

例如我有以下键

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

我找到了下面的 sn-p,它创建了一个 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}
}

【问题讨论】:

  • 为什么不拿一个对象?
  • 好吧,从技术上讲,这将是一个对象,因为 js 中不存在 assoc 数组。我会编辑
  • 代替Array(5).fill(0)试试Array.from( {length: 5}, () => 0 )
  • 您是否要创建sparse matrix?显然有现成的 JS 库可以处理稀疏矩阵,例如math.js.
  • @stop-cran 不,它只是尝试创建一个可编辑的网格作为表单。

标签: javascript arrays ecmascript-6


【解决方案1】:

您可以通过循环和减少数据来创建想要的对象。

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);

【讨论】:

  • 感谢您,我收到“箭头函数不应返回赋值”的警告。有解决办法吗?
【解决方案2】:

您可以通过map y 数组获取row 对象的条目。使用Object.fromEntries() 从条目中获取对象。然后mapx数组得到输出对象,每个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)

    【讨论】:

      【解决方案4】:

      你可以使用 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);

      【讨论】:

        猜你喜欢
        • 2020-04-21
        • 2011-09-30
        • 2018-08-22
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 2021-06-03
        • 2013-08-12
        相关资源
        最近更新 更多