2012-06-27 2 views
1

У меня есть следующий код:Javascript Array.push методом эмиссионной

function build_all_combinations(input_array){ 
    array = [1,2,3] 
    limit = array.length - 1 
    combo = [] 

    for(i = 0; i<= limit; i++){ 
     splice_value = array.splice(0,1) 
     push_value = splice_value[0] 
     array.push(push_value) 
     console.log(array) 
     combo.push(array) 
    } 
    console.log(combo) 
} 

который выводит:

[2, 3, 1] 
[3, 1, 2] 
[1, 2, 3] 
[[1, 2, 3], [1, 2, 3], [1, 2, 3]] 

Последняя строка должна быть: [[2, 3, 1],[3, 1, 2],[1, 2, 3]]

Я, очевидно, не grokking что-то о том, как работает массив. Каждый отдельный массив правильный, но когда я иду, чтобы подтолкнуть их к комбинированному массиву, что-то не удается на этом пути. Что это?

+0

Что вы хотите быть? –

+1

Являются ли эти переменные определенными в другом месте? как насчет 'i'? похоже, что это глобально. Попробуйте сделать 'i' local с' var' -> 'for (var i = 0 ...' – elclanrs

+0

Вы хотите нажать push_value в комбо? –

ответ

2

jordan002 дал объяснения этому поведению.

Вот обходной путь.

array = [1,2,3] 
limit = array.length - 1 
combo = [] 
for(i = 0; i<= limit; i++){ 
splice_value = array.splice(0,1) 
push_value = splice_value[0]; 
array.push(push_value); 
console.log(array); 
combo.push(array.concat([])); 
} 
console.log(combo); 

Вы можете сохранить копию в переменной temp.

array = [1,2,3] 
limit = array.length - 1 
combo = [] 
for(i = 0; i<= limit; i++){ 
splice_value = array.splice(0,1) 
push_value = splice_value[0]; 
array.push(push_value); 
console.log(array); 
var temp = array.slice(); 
combo.push(temp); 
} 
console.log(combo) 

Reference

+0

Это работает! у меня есть возможность использовать array.new какой-то способ, а не concat? Это кажется более явным в том, что вы делаете. –

+0

@NoahClark, обновил мой код – Jashwant

+1

Я проголосовал за вас –

5

Каждый раз, когда вы нажимаете один и тот же массив в комбинированный массив; т.е. все ссылки указывают на один и тот же экземпляр в памяти. Поэтому, когда вы обновляете один, вы на самом деле обновили их все.

Если вам нужны отдельные ссылки, вам необходимо создать отдельные массивы.

+0

Я могу использовать 'array.new()', но тогда как Я установил его равным другому массиву без установки того же экземпляра в памяти? –

+2

@NoahClark Самый простой способ сделать копию массива: 'var copy = old.slice (0);' – Pointy

+0

@Pointy thanks! –

3

shift и slice ваши друзья здесь:

var array = [1,2,3]; 
var combo = [] 
for(var i = 0; i<array.length; i++){ 
    array.push(array.shift()); // remove first element (shift) and add it to the end (push) 
    combo.push(array.slice()); // add a copy of the current array to combo 
} 

DEMO

+0

I ' ve добавил это к решению! –