带有数组的jQuery循环中的奇怪行为

时间:2014-06-01 11:46:42

标签: javascript jquery arrays

我遇到以下代码的问题:

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;

此脚本的目标是汇总来自相同货币的所有值,但仍然不会弄乱初始数组。 但它仍然会改变最初的阵列。任何人都可以帮我解决这个错误吗?

3 个答案:

答案 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);