【问题标题】:js - Declare multidimensional array + push key and valuejs - 声明多维数组 + 按键和值
【发布时间】:2023-03-23 12:36:01
【问题描述】:

这里到底哪里错了?我收到“无法读取未定义的属性 'push'”错误,我认为这是因为无法通过简单地在循环中声明数组来将其设置为多维。

var single = [];
for (var i = 0; i < all.length; i++) {
    name = all[i].name;
    single[name].push(all[i]);
}

我想要实现的是这个结构:

Array (
([name1] => [node1],[node2],[node3]),
([name2] => [node1],[node2],[node3],[node4],[node5],[node6]),
([name2] => [node1],[node2])
etc...
)

我试过在这里搜索 SO,但到目前为止只有两个选项:

选项 1:声明变量的简写,也就是 [[]],它不起作用。

var single = [[]];

选项 2link 在填充之前添加​​另一个循环来计算数组。

var matrix = []
cols = 3;
//init the grid matrix
for ( var i = 0; i < cols; i++ ) {
 matrix[i] = []; 
}

我宁愿找到一个更短的解决方案,也是因为我的数组元素必须有键,而在上面的解决方案中它们是编号的。

编辑:既然 JS 数组中的键不是一个选项,那么在这种情况下对象可以解决问题吗?类似:

var obj = {
key1: value1,
key2: value2
};
obj.key3 = "value3";

【问题讨论】:

  • 你想要的结构无效,数组中不能有命名键
  • 在JS中绝对没有办法做到这一点?
  • 数组中的所有键都是/必须是javascript中的整数

标签: javascript arrays for-loop multidimensional-array push


【解决方案1】:

您可以使用对象或 Map (ES6) 数据结构来实现这一点,例如:

var single = {};
for (var i = 0; i < all.length; i++) {
    name = all[i].name;
    if (!single[name]) {
        single[name] = [];
    }
    single[name].push(all[i]);
}

结果(single 对象)如下所示:

{
    name1: [node1, node2, node3],
    name2: [node1, node2, node3, node4, node5, node6],
    name2: [node1, node2]
}

【讨论】:

    【解决方案2】:

    Javascript 使用对象和数组。没有多维数组。

    你想要的结构在 javascript 中应该是这样的:

    {
        name1: [a,b,c],
        name2: [d,e,f]
    }
    

    其实在 JS 中,你可以用这样的对象(对象字面量)来定义一个变量:

    var myObject = {
        name1: [a,b,c],
        name2: [d,e,f]
    }
    

    在 JS 中构造对象不需要迭代,对象文字易于理解且速度快。

    如果由于某种原因您需要将某些数据映射到您想要的这种新格式,我个人会使用诸如 Array.prototype.reduce 之类的方法。

    myMap = all.reduce(function (result, item) {
        result[item.name] = (result[item.name] || []).push(item);
        return result;
    },{});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2013-07-02
      相关资源
      最近更新 更多