2015-03-13 5 views
-4

У меня есть объект, и для каждого элемента я могу сгенерировать случайное число. Я использую этот простой код:Многократный цикл Javascript со ссылкой

var ss = []; 
var a = [{ i: 5, _r: 0 }, { i: 6, _r: 0 }, { i: 7, _r: 0 }]; 
var b = function (a) { for (var i = 0; i < a.length; i++) { a[i]._r = Math.random(); } return a; }; 
for (j = 0; j < 5; j++) { ss.push(b(a)); }; 
console.log(ss); 

После массива журнала я получаю тот же объект для каждого массива. Соответственно ss [0] [0] ._ r = ss [1] [0] ._ r = ss [2] [0] ._ r. Но ключ _r - это Math.random, это неправильно. Я хотел бы иметь в каждом ключе _r случайное число.

И для поиска решения необходимо использовать функцию b! Спасибо

+1

Вы просто перезаписываете одни и те же свойства 'a' снова и снова. Клонировать его где-то по пути. – Sirko

+0

Этот вопрос является точным дубликатом [вашего прежнего вопроса] (http://stackoverflow.com/q/29032962/1048572). Пожалуйста, не делайте этого, редактируйте свой вопрос, а не удаляйте и повторно отправляйте его. – Bergi

ответ

1

JavaScript передает аргументы по ссылке, поэтому всякий раз, когда вы передаете массив своей функции, вы передаете один и тот же экземпляр и добавляете его в массив результатов. Следовательно, они все одинаковые.

Простым решением было бы построить новый массив внутри b и вернуть его.

var ss = []; 
var a = [{ i: 5, _r: 0 }, { i: 6, _r: 0 }, { i: 7, _r: 0 }]; 
var b = function (x) { 
    var result = []; 
    for (var j = 0; j < x.length; j++) { 
     result.push({ i : x[j].i, _r : Math.random()}); 
    } 
    return result; 
}; 
for (j = 0; j < 5; j++) { ss.push(b(a)); }; 
console.log(ss); 

Я не совсем уверен, целью которого другая собственность служит, но вы также можете передать некоторый входной массив и использовать его для расчета. Важным моментом является создание нового массива.

+0

Вам понравился отредактированный экзамен? Теперь я над умом. Спасибо – user1173536

+1

Аргументы на самом деле [переданы по ссылке] (http://stackoverflow.com/a/3638034/2476755); они передаются по значению (но вы можете изменить ссылку на объект). – royhowie

+0

Извините, этот пример для решения не работает – user1173536

Смежные вопросы