如何高效地创建多维javascript数组?
我需要存储类似以下内容的信息:如何高效地创建多维javascript数组?,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我需要存储类似以下内容的信息: tag_array['design1']['0'][0]['x'] = 100; tag_array['design1']['0'][0]['y'] = 100; tag_array['design1']['0'][0]['w'] = 710; tag_array['design1']['0'][0]['h'] = 332; 如果它是PHP,但在javascript中不起作用,那么这是可行的 如何用正确的javascript语法创建相同的数组?在PHP中,您可以
tag_array['design1']['0'][0]['x'] = 100;
tag_array['design1']['0'][0]['y'] = 100;
tag_array['design1']['0'][0]['w'] = 710;
tag_array['design1']['0'][0]['h'] = 332;
如果它是PHP,但在javascript中不起作用,那么这是可行的
如何用正确的javascript语法创建相同的数组?在PHP中,您可以这样做,因为它也会生成父元素(它实际上会抛出一个警告)。在JavaScript中,它将出错,因为父元素不存在 不要让它变成那样,试着让它一下子变成这样:
var tag_array = {
design1: {
'0': [{
x: 100,
y: 100,
w: 710,
h: 332
}]
}
};
这将为您提供所需的结构
更新:答案已更新,以反映第一个
0
可以是字符串的事实。如果您希望以编程方式执行,则因为JavaScript要求您具有这种类型的结构
tag_array = {};
tag_array['design1'] = {};
tag_array['design1']['0'] = [];
tag_array['design1']['0'][0] = {};
tag_array['design1']['0'][0]['x'] = 100;
您可以制作一个prototype
函数来为您创建对象/数组结构
Object.defineProperty(Object.prototype, 'addDimensions', { value: function(){
var prop = arguments[0];
if(this[prop] !== undefined){
if(typeof this[prop] !== 'object') throw 'Property "'+prop+'" is already defined.'
}else{
if(arguments.length > 1 && ~~arguments[1] === arguments[1] && arguments[1] >= 0) this[prop] = [];
else this[prop] = {};
}
if(arguments.length > 1){
this[arguments[0]].addDimensions.apply(
this[arguments[0]],
Array.prototype.slice.call(arguments,1)
);
}
return this;
},
enumerable: false });
并对空对象调用它{}
var myArrayLikeObject = ({}).addDimensions('design1','0',0); // {design1: [ [ {} ] ] }
或数组[]
(仅当第一个参数为整数时)
或在现有数组或对象上
var a = [0,1,2];
a.addDimensions(3,0); // a = [0, 1, 2, [ {} ] ]
请参阅本文,因为您使用的是字符串,所以使用对象比使用数组更好。但它是字符串“0”而不是整数。数字属性的字符串版本可以与数字索引数组元素@epascarello一起使用,但您是对的。这里不清楚OP需要哪种设置。OP。是的,第一个“0”是字符串。可以替换为任何其他字符串。在javascript中,当您访问属性时,它将作为字符串访问。因为数组只是一种奇特的对象,所以它们的行为方式是相同的
a[0]
和a[“0”]
做同样的事情,因为在第一种情况下,在查找属性之前,数字0
被转换为字符串。@Rocket如何使用您的语法直接插入数字4?如下所示:tag_数组['design1']['0'][4]如果要在同一索引上多次调用它,则需要对其进行一些修改,以检查现有的子数组/对象-1:a)永远不要向对象添加可枚举属性。prototype
,b)将对象({}
)用于非数字属性,而不是arrays@Bergi,我刚做的编辑解决了你的问题吗?
var a = [0,1,2];
a.addDimensions(3,0); // a = [0, 1, 2, [ {} ] ]