如何在不使用JSON.stringify或JSON.parse的情况下用javascript克隆数组
How to clone an array in javascript without using JSON.stringify or JSON.parse?
我有一个数组示例fruit
。我想将它复制为数组fruits2
,而不保留引用。
如在下面的示例中一样,保留参考,因此fruits
被修改。
var fruit = function (name){
this.name = name;
}
var fruits = [];
fruits.push(new fruit('apple'));
fruits.push(new fruit('banana'));
fruits.push(new fruit('orange'));
var fruits2 = fruits;
fruits2.length = 0;
console.log(fruits);
http://jsfiddle.net/vkdqur82/
使用JSON.stringify和JSON.parse可以完成任务,但fruits2
中的对象不再是fruit
类型,而是一般类型的object
var temp = JSON.stringify(fruits);
var fruits2 = JSON.parse(temp);
我想知道一种替代方法,可以保留fruit
的内部对象。
使用slice
:var fruits2 = fruits.slice();
应该这样做。
您的jsFiddle,已修改
另请参阅:MDN
**编辑。我有点懒,让我们纠正我的答案来弥补这一点。
对于一个只有值的CCD_ 10,CCD_。对于对象或数组的Array
或值/对象/数组的混合,要克隆的Array
的Array
和Object
元素也需要克隆。否则,它们将是对原始数组或对象的引用(因此:不是副本),其中一个数组或对象引用的更改将反映在所有包含引用的"克隆"中。
要克隆数组/对象/混合值的Array
,Array.map
是您的朋友。有几种方法可以考虑:
- 使用旧数据创建新实例
var fruits1 = fruits.map(function(v) {return new Fruit(v.name);});
- 使用JSON
var fruits2 = fruits.map(function(v) {return JSON.parse(JSON.stringify(v));});
- 创建并使用一些克隆方法
var fruits3 = fruits.map(function(v) {return cloneObj(v);});
在情况3中,一种克隆方法可能看起来像:
function cloneObj(obj) {
function clone(o, curr) {
for (var l in o){
if (o[l] instanceof Object) {
curr[l] = cloneObj(o[l]);
} else {
curr[l] = o[l];
}
}
return curr;
}
return obj instanceof Array
? obj.slice().map( function (v) { return cloneObj(v); } )
: obj instanceof Object
? clone(obj, {})
: obj;
}
使用此cloneObj
方法,Array.map
已过时
您也可以使用var fruitsx = cloneObj(fruits);
对上面链接中的jsFiddle进行了修改,以演示这些方法。
对于Array.map
,请再次参见MDN
slice
可以做到这一点。
您也可以使用.map
,但.slice
通常更快。
var copy = fruits.map(function(item) {return item});
希望它能帮助
您可以声明一个新数组并使用concat方法,以便将数组中的所有值连接到新数组中。类似这样的东西:
var x = ["a","b"];
var a = [];
a = a.concat(x);
console.log(a);
我修改了我糟糕的回答。
致以最良好的问候。
- 如何在不在本地下载的情况下将url中提供的文件(pdf/doc)转换为json/string/base64格式
- 在不使用lodash-get的情况下从json中提取深层属性
- 在禁用ng的情况下搜索JSON对象(AngularJS)
- 如何避免JSON.stringify在特殊情况下返回undefined,从而为JSON.parse创建字符串失败
- 在什么情况下,应该.deep.equal失败,但使用JSON.stringify进行比较工作正常
- 在不使用jQuery的情况下解析json,并在HTML代码中添加值
- 在不更改大量代码的情况下重新构造Firebase JSON数据
- 在没有jsonp的情况下从另一个域获取数据(json格式)
- 如何在没有冒号、反斜杠、大括号或引号的情况下使用JSON.stringfy(anObject)
- 在没有JQuery的情况下将JSON数据获取到TVML项目中
- 在不知道名称的情况下检索json元素
- jQuery在没有数据库的情况下从php-json自动完成
- 在这种情况下,如何访问我的JSON代码
- 如何在不发生冲突的情况下处理多个json请求
- 如何在URL中不指定.html、.json的情况下配置web.xml来服务任何请求
- 在不使用AJAX的情况下将JSON字符串发送到php文件
- 在不使用jQuery的情况下连接两个JSON对象
- 在没有额外外部库的情况下,将JSON数据分组为周/月
- 如何在不丢失浮点精度的情况下填充 JSON 数据
- 在不知道名称的情况下访问 json 对象中的元素