对象的深度克隆数组
Deep clone array of objects
我有一个维护内部对象数组的javascript对象。我有一个返回数组的方法,但我需要防止对数组及其内部对象的外部操作。
尝试slice
复制数组,但我注意到里面的对象仍然是对原始对象的引用,而数组本身是新的。我以前从未注意到这一点,但我已经确认了:
function test(){
// I want this to be safe from outside influence
var a = [{
val: 1
},{
val: 2
}];
return {
all: function(){
return a.slice();
}
}
}
var instance = test();
var copy = instance.all();
// This affects both "copy" and the original
copy[0].val = 'wrong';
// This clears "copy" but doesn't affect the original
copy = [];
http://jsfiddle.net/dczz7sL4/1/
我需要有一个真正的新副本,这样局外人就无法在不使用我设计的 API 方法的情况下修改数组。我假设我能做的就是迭代数组并使用$.extend
(或其他库的类似方法)单独克隆对象 - 有没有更简单/本机的替代方案?
深层拷贝的简单实现是
function clone(obj) {
return JSON.parse(JSON.stringify(obj));
}
请注意,如果对象中有循环引用,或者有函数,则这不起作用。
您还可以使用jQuery.extend
传递 true 作为深层副本的第一个参数
var a =[{a:1}]
var b = $.extend(true, [], a);
b[0].a = 0;
$('#first').html(JSON.stringify(a));
$('#second').html(JSON.stringify(b));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
First Array: <span id='first'></span> <br />
Clonde Array: <span id='second'></span>
相关文章:
- 与 lodash 进行对象深度比较的数组
- javascript中嵌套对象的深度复制数组
- Algo查找深度并在JSON数组中按顺序插入
- 返回所有DOM元素的数组,按深度排序
- 用javascript将一个对象数组复制到另一个数组中(深度复制)
- 深度减少(也许是采摘?)对象数组
- Ramda js:用于具有嵌套对象数组的深度嵌套对象的镜头
- 在 Angular 2 + TypeScript 中深度复制数组
- 平展深度嵌套的对象数组
- 对象的深度克隆数组
- Angular.copy() 不是深度复制引用的数组
- 角度$filter,用于在 JSON 响应中的数组中进行深度过滤
- JavaScript:将线性JSON数组转换为深度未知的树结构
- 如何在没有递归的情况下迭代n级深度的数组
- 通过深度索引访问数组元素
- 在javascript数组中查找和修改深度嵌套对象
- 映射数组到对象的深度基于单独的对象
- 排序对象的多维数组与一个可变的深度在Javascript
- 如何在javascript中深度复制对象作为对象而不是数组
- 对于JavaScript多维数组的深度拷贝,深入一层似乎就足够了.这是真的吗?