rosuandreimihai
rosuandreimihai

Reputation: 656

Strange behavior in jQuery loop with arrays

I am having an issue with the following code:

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

The problem is that I do not want that samount variable to change after looping, so I have done this:

var object1 = new Array;
objects1 = samount;

The goal of this script is to sum up all values from the same currencies, but still to not mess with the initial array. But it still changes the initial Array. Could anyone help me with this error?

Upvotes: 0

Views: 61

Answers (3)

Florian F.
Florian F.

Reputation: 4700

You need to deep copy the initial array instead of affecting it.

var samount = [{value:100, name:'USD'},
             {value:200, name:'USD'},
             {value:100, name:'USD'}];
var object1  = $.extend(true, [], samount);

You were doing an affectation (i.e. 2 variables pointing to the same object) where you needed a copy (2 variables pointing to 2 different objects)

Upvotes: 2

Richard Deurwaarder
Richard Deurwaarder

Reputation: 2040

The problem is you're not creating a copy with

objects1 = samount

In most OO languages, you can only copy primitive types so int, strings characters etc, but not objects.

This is somewhat similar in javascript in the sense that {} is an object, same as Array or [].

So if you want to copy an object you'd have to iterate over every element of that object till you find an primitive type. This can be tedious and quite hard even (http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/) this is called a deep copy.

But in this case a shallow copy (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) is enough

var objects1 = samount.slice(0);

Upvotes: 0

adeneo
adeneo

Reputation: 318182

Copy the array with slice

var objects1 = samount.slice(0);

Arrays and object are passed by "reference" (not really, but doesn't matter here), so when assigning an array to a new variable, all you get is a reference to the same array, not a new array.

Upvotes: 3

Related Questions