0

从技术上讲,Javascript 中没有关联数组之类的东西。但是由于我无法避免的原因,我最终没有做诸如

var x = [1,2,3];
x.someRequiredProperty = 'some value';

正如预期的那样,Javascript 是 Javascript,它可以工作。但是现在,我如何制作这个“数组”的副本,以便我可以处理这个数组的多个实例而不损害原始?

我试过 jQuery $.extend([], x),它并没有真正给我一个新的副本。有什么我想念的吗?

4

3 回答 3

1

我不喜欢“关联”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/

于 2012-07-11T09:30:39.620 回答
0

首先,如果你想要一个关联数组,你应该使用一个对象:

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/

于 2012-07-11T09:22:32.730 回答
0

让我回答我自己的问题 - 出于我的所有目的 - 使用数组的深层克隆$.extend(true, [], myArray)为我提供了一个新数组,我的所有属性都完好无损。但我喜欢@CodeMonkey 的回答

于 2012-07-11T09:41:29.207 回答