当前位置:  开发笔记 > 编程语言 > 正文

(深)使用jQuery复制数组

如何解决《(深)使用jQuery复制数组》经验,为你挑选了5个好方法。

由于Array.slice()不进行深度复制,因此它不适用于多维数组:

var a =[[1], [2], [3]];
var b = a.slice();

b.shift().shift();
// a is now [[], [2], [3]]

请注意,虽然我已经在shift().shift()上面使用过,但只是b[0][0]包含指向a[0][0]而不是值的指针.

同样delete(b[0][0])也会导致 a[0][0]被删除,b[0][0]=99并将值更改a[0][0]为99.

当一个真值作为初始参数传递时,jQuery的extend方法执行深层复制:

var a =[[1], [2], [3]];
var b = $.extend(true, [], a);

b.shift().shift();
// a is still [[1], [2], [3]]

谢谢诺亚.看起来我最大的问题是我将$ .extend和object作为它的第一个参数,而不是数组. (14认同)

你能解释一下b.shift().shift()的目的是什么? (2认同)


geowa4.. 29

$.extend(true, [], [['a', ['c']], 'b'])

那应该为你做.



1> Noah Sussman..:

由于Array.slice()不进行深度复制,因此它不适用于多维数组:

var a =[[1], [2], [3]];
var b = a.slice();

b.shift().shift();
// a is now [[], [2], [3]]

请注意,虽然我已经在shift().shift()上面使用过,但只是b[0][0]包含指向a[0][0]而不是值的指针.

同样delete(b[0][0])也会导致 a[0][0]被删除,b[0][0]=99并将值更改a[0][0]为99.

当一个真值作为初始参数传递时,jQuery的extend方法执行深层复制:

var a =[[1], [2], [3]];
var b = $.extend(true, [], a);

b.shift().shift();
// a is still [[1], [2], [3]]


谢谢诺亚.看起来我最大的问题是我将$ .extend和object作为它的第一个参数,而不是数组.
你能解释一下b.shift().shift()的目的是什么?

2> geowa4..:

$.extend(true, [], [['a', ['c']], 'b'])

那应该为你做.



3> scunliffe..:

我意识到你正在寻找一个数组的"深层"副本,但如果你只有一个单级数组,你可以使用它:

复制本机JS数组很容易.使用Array.slice()方法创建部分/全部数组的副本.

var foo = ['a','b','c','d','e'];
var bar = foo.slice();

现在foo和bar是'a','b','c','d','e'的5个成员数组

当然吧是副本,而不是参考...所以如果你接下来这样做...

bar.push('f');
alert('foo:' + foo.join(', '));
alert('bar:' + bar.join(', '));

你现在会得到:

foo:a, b, c, d, e
bar:a, b, c, d, e, f


请注意,这不是深层副本.
Array.slice不提供深层副本,这是非常具体的问题.

4> 小智..:

JavaScript中的所有内容都是通过引用传递的,所以如果你想要一个真正的数组中对象的深层副本,我能想到的最好的方法是将整个数组序列化为JSON,然后将其反序列化.


基元不通过引用传递.但是,对象(包括数组)是.

5> 小智..:

如果你想使用纯JavaScript,那么试试这个:

 var arr=["apple","ball","cat","dog"];
 var narr=[];

 for(var i=0;i

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有