js - 声明多维数组+推键和值

时间:2015-12-26 13:23:13

标签: javascript arrays for-loop multidimensional-array 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 = [[]];

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用对象或地图(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]
}

答案 1 :(得分:0)

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;
},{});