从技术上讲,Javascript 中没有关联数组之类的东西。但是由于我无法避免的原因,我最终没有做诸如
var x = [1,2,3];
x.someRequiredProperty = 'some value';
正如预期的那样,Javascript 是 Javascript,它可以工作。但是现在,我如何制作这个“数组”的副本,以便我可以处理这个数组的多个实例而不损害原始?
我试过 jQuery $.extend([], x)
,它并没有真正给我一个新的副本。有什么我想念的吗?
从技术上讲,Javascript 中没有关联数组之类的东西。但是由于我无法避免的原因,我最终没有做诸如
var x = [1,2,3];
x.someRequiredProperty = 'some value';
正如预期的那样,Javascript 是 Javascript,它可以工作。但是现在,我如何制作这个“数组”的副本,以便我可以处理这个数组的多个实例而不损害原始?
我试过 jQuery $.extend([], x)
,它并没有真正给我一个新的副本。有什么我想念的吗?
我不喜欢“关联”Javascript 数组的想法,因为向数组添加属性对 JavaScript 没有意义。例如,length
属性只会计算索引元素(而不是属性),但for(var x in assoc_array)
会遍历数组的索引以及“键”。因此,要仅循环数组项,您必须使用完整的 for 循环for(var i = 0; i < assoc_array.length; i++)...
。
无论如何,这样的复制功能将适用于您的目的:
function copy_assoc(arr)
{
var out = [];
for(var key in arr)
{
if(!arr.hasOwnProperty(key))
{
continue;
}
out[key] = arr[key];
}
return out;
}
这是一个正在使用的演示:http: //jsfiddle.net/DbVV8/3/
首先,如果你想要一个关联数组,你应该使用一个对象:
var x = {};
x[0] = 1;
x[1] = 2;
x[2] = 3;
x.someProperty = 'Foo';
然后,如果你想要一个副本,你可以使用 jQuery 的each
函数来迭代每个属性并构建一个副本:
var copy = {};
$.each(x,function(i,e){
copy[i] = e;
});
现场示例:http: //jsfiddle.net/KhBC9/
让我回答我自己的问题 - 出于我的所有目的 - 使用数组的深层克隆$.extend(true, [], myArray)
为我提供了一个新数组,我的所有属性都完好无损。但我喜欢@CodeMonkey 的回答。