克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
可能重复:
克隆JavaScript对象的最有效方法是什么?
这也被称为"深度复制",我发现了一些文章.最接近的似乎是这个,但是它适用于jQuery - 我试图在没有库的情况下这样做.
我也在两个地方看到过这样的事情:
arr2 = JSON.decode(JSON.encode(arr1));
Run Code Online (Sandbox Code Playgroud)
但这显然效率低下.也可以单独循环和复制每个值,并在所有数组中重复.这看起来很累人也很低效.
那么复制JavaScript多维数组的最有效的非库方式是[[a],[b],[c]]什么?如果有必要,我对"非IE"方法非常满意.
谢谢!
我试图使用jQuery $ .extend合并两个对象.
使用以下代码,我试图提醒("Ball - Stump - Umpire").但目前的输出是("Undefined - Stump - Umpire").它没有实现深度(递归)副本.我们如何纠正这个?
$(document).ready(function () {
debugger;
//$.extend
var obj3 = { throwable: { text1: 'Ball' }, text3: 'Umpire' };
var obj4 = { throwable: { text4: 'Bat' }, text2: 'Stump' }
//Simple Copy
var result1 = $.extend(obj3, obj4);
//alert(result1.throwable.text4 + " - " + result1.text2 + " - " + result1.text3);
//Deep Copy
//First parameter is passed as Boolean true to accomplish deep (recursive) copy
var result2 = $.extend(true, obj3, …Run Code Online (Sandbox Code Playgroud) 我不能复制数组.
var Mycollection = new Array("James","Jonh","Mary");
var Mycollection2 = Mycollection;
Run Code Online (Sandbox Code Playgroud)
第一个数组中的任何更改也会在第二个数组中进行.
Mycollection.pop();
console.log(Mycollection.toString()) // ["James","Jonh"]
console.log(Mycollection2.toString())// ["James","Jonh"]
Run Code Online (Sandbox Code Playgroud)
但是,当我使用文本类型的变量时,不会发生这种情况
将数组分配给另一个变量时,将传递引用而不是值.当您使用==运算符比较两个数组并且它返回时,会确认这一点true
var a = [[1,2],[3,4],[5,6]];
var b = a; // b = [[1,2],[3,4],[5,6]]
var c = [].concat(a); // c = [[1,2],[3,4],[5,6]]
a == b; //true
a == c; //false
Run Code Online (Sandbox Code Playgroud)
通过上面的输入,当我修改数组时b,它会改变数组a,但不是c.
b.push([7,8]); // b = [[1,2],[3,4],[5,6], [7,8]]
a; //a = [[1,2],[3,4],[5,6], [7,8]]
c; //c = [[1,2],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)
但是当我在下面做的时候,它会发生变异c.
b[0].push(5); // b = [[1,2,5],[3,4],[5,6], [7,8]]
a; //a = [[1,2,5],[3,4],[5,6], [7,8]]
c; //c = [[1,2,5],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)
为什么会这样?使用改变数组的数组方法会发生此行为.
以下Javascript控制台:
var a = {'foo': []};
var b = {};
for (var key in a) {
b[key] = a[key];
}
a['foo'].push(1);
console.log(b);
Run Code Online (Sandbox Code Playgroud)
产量:
Object foo=[1]
我想为a中的每个键的每个数组的b中的值创建一个副本.有没有更简单的方法?
我正在尝试创建一个复制数组数组的函数.我试过blah.slice(0); 但它只复制引用.我需要复制一份原版完整的原件.
我在http://my.opera.com/GreyWyvern/blog/show.dml/1725165找到了这个原型方法
Object.prototype.clone = function() {
var newObj = (this instanceof Array) ? [] : {};
for (i in this) {
if (i == 'clone') continue;
if (this[i] && typeof this[i] == "object") {
newObj[i] = this[i].clone();
} else newObj[i] = this[i]
} return newObj;
};
Run Code Online (Sandbox Code Playgroud)
它工作,但搞砸了我正在使用的jQuery插件 - 所以我需要把它变成一个函数......并且递归不是我最强的.
非常感谢您的帮助!
干杯,
注意:我只是一个新手程序员,所以这个问题的核心可能是明显的错误或误解。
本质上,我需要将JavaScript中的“按值”多维数组深度复制到未知深度。我认为这将需要一些复杂的递归,但是似乎在JavaScript中,您只需要复制一个级别就可以按值复制整个数组。
举个例子,这是我的测试代码,它使用了一个故意卷积的数组。
function test() {
var arr = [ ['ok1'],[],[ [],[],[ [], [ [ ['ok2'], [] ] ] ] ] ];
var cloned = cloneArray(arr);
arr = ''; // Delete the original
alert ( cloned );
}
function cloneArray(arr) {
// Deep copy arrays. Going one level deep seems to be enough.
var clone = [];
for (i=0; i<arr.length; i++) {
clone.push( arr[i].slice(0) )
}
return clone;
}
Run Code Online (Sandbox Code Playgroud)
在我运行此测试(Ubuntu上最新稳定的Chrome和Firefox)的过程中,即使删除了原始数组,即使数组最深的部分也似乎已成功通过克隆中的值成功复制,即使slice_()复制”仅深入了一层。这是JavaScript中的标准行为吗?我可以依靠它来运行较旧的浏览器吗?
我有一个数组如下
var sample = [{a:1, b: 1, c:1}, {a:1, b: 1, c:1}, {a:1, b: 1, c:1}];
Run Code Online (Sandbox Code Playgroud)
然后我运行下面的代码,并尝试groupsOfItems[0].sample[0].a = 10, groupsOfItems[0].sample[0].a,groupsOfItems[1].sample[0].a并groupsOfItems[2].sample[0].a获得变更为10.
我该如何防止这种情况?
var sample = [{a:1, b: 1, c:1}, {a:1, b: 1, c:1}, {a:1, b: 1, c:1}];
var groupsOfItems = [];
for(let i = 0; i < 10; i++) {
var item = {};
item.sample = _.clone(sample);
groupsOfItems.push(item);
}
groupsOfItems[0].sample[0].a = 10
console.log(groupsOfItems[0].sample[0].a,groupsOfItems[1].sample[0].a,groupsOfItems[2].sample[0].a);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>Run Code Online (Sandbox Code Playgroud)
barValues是我传递给函数的数组.在函数中我有这个:
alert(barValues);
var sortedBarValues = barValues;
sortedBarValues.sort(function(a,b){return b - a});
alert(barValues);
Run Code Online (Sandbox Code Playgroud)
我试图最终得到两个阵列.barValues是原始数组,sortedBarValues是该数组的副本,现在已经排序.
但是,通过这两个警报,我发现barValues也被排序了.这是为什么?制作数组副本的正确方法是什么,以便将其与原始数组分开?
我正在尝试编写一个自定义字符串拆分函数,它比我预期的更难.
基本上,我传入一个字符串和一个字符串将拆分的值数组,它将返回一个子字符串数组,删除空字符串并包括它分割的值.如果字符串可以通过两个不同的值在同一位置拆分,则较长的字符串优先.
那是,
split("Go ye away, I want some peace && quiet. & Thanks.", ["Go ", ",", "&&", "&", "."]);
Run Code Online (Sandbox Code Playgroud)
应该回来
["Go ", "ye away", ",", " I want some peace ", "&&", " quiet", ".", " ", "&", " Thanks", "."]
Run Code Online (Sandbox Code Playgroud)
你能想到一个相当简单的算法吗?如果有一种内置的方式在Javascript(我不认为有)这样做,它会更好.