js - 声明多维数组+推送键和值
js - Declare multidimensional array + push key and value
这里到底哪里错了?我得到一个 "Cannot read property 'push' of undefined" 错误,我相信那是因为数组不能通过简单地在循环中声明它来设置为多维。
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:Shorthand 在声明变量时,又名 [[]],这是行不通的。
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";
您可以使用对象或 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]
}
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;
},{});
这里到底哪里错了?我得到一个 "Cannot read property 'push' of undefined" 错误,我相信那是因为数组不能通过简单地在循环中声明它来设置为多维。
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:Shorthand 在声明变量时,又名 [[]],这是行不通的。
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";
您可以使用对象或 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]
}
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;
},{});