我遇到以下代码的问题:
var samount = [{value:100, name:'USD'},
{value:200, name:'USD'},
{value:100, name:'USD'}];
var object1 = new Array;
objects1 = samount;
var categories1 = new Array();
var groupedObjects1 = [];
var output1 = '';
var i = 0;
console.log(samount);
_.each(objects1,function(obj){
var existingObj;
if($.inArray(obj.currency,categories1) >= 0) {
existingObj = _.find(objects1,function(o){return o.currency === obj.currency;});
existingObj.value += obj.value;
} else {
groupedObjects1[i] = obj;
categories1[i] = obj.currency;
i++;
}
});
console.log(samount);
console.log(groupedObjects1);
问题是我不希望循环后改变 samount 变量,所以我这样做了:
var object1 = new Array;
objects1 = samount;
此脚本的目标是汇总来自相同货币的所有值,但仍然不会弄乱初始数组。 但它仍然会改变最初的阵列。任何人都可以帮我解决这个错误吗?
答案 0 :(得分:3)
使用切片复制数组
var objects1 = samount.slice(0);
数组和对象通过“引用”传递(不是真的,但在这里并不重要),因此在为新变量分配数组时,所得到的只是对同一数组的引用,而不是新数组。
答案 1 :(得分:2)
您需要深度复制初始数组而不是影响它。
var samount = [{value:100, name:'USD'},
{value:200, name:'USD'},
{value:100, name:'USD'}];
var object1 = $.extend(true, [], samount);
您正在做一个需要复制的情感(即2个指向同一对象的变量)(2个变量指向2个不同的对象)
答案 2 :(得分:0)
问题是你没有使用
创建副本objects1 = samount
在大多数OO语言中,您只能复制原始类型,如int,字符串等,但不能复制对象。
这在javascript中有点类似于{}是一个对象,与Array或[]相同。
因此,如果要复制对象,则必须迭代该对象的每个元素,直到找到基本类型。这可能是单调乏味的,甚至很难(http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/)这称为深拷贝。
但在这种情况下,浅拷贝(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)就足够了
var objects1 = samount.slice(0);