2016-04-19 3 views
3

Я пытаюсь создать двумерный массив строк 1-символов в JavaScript таким образом:Двумерное создание массив строк

var panel = new Array(3).fill(new Array(3).fill('*')); 

Результат является

[ 
    ['*', '*', '*'], 
    ['*', '*', '*'], 
    ['*', '*', '*'] 
] 

После того, что мне нужно заменить среднюю строку:

panel[1][1] = '#'; 

и результат

[ 
    ['*', '#', '*'], 
    ['*', '#', '*'], 
    ['*', '#', '*'] 
] 

Похоже, что прототип функции fill заполняет массив объектом по ссылке.

Можно ли использовать функцию fill для заполнения массива различными экземплярами объектов? Если нет, то какой подход к созданию этого двухмерного массива, на ваш взгляд, лучший?


Update

Алгоритм предполагает создать плоскость звездочек, а затем многие из этих звездочек будут заменены еще символы, создавая некоторый разумный результат. После этого он будет напечатан.

В C это может быть сделано с использованием матрицы char и смены символов по любым показателям. Но поскольку мы не можем просто изменить один символ в строке javascript, я пытаюсь найти хороший аналог.

В настоящее время я создал двумерный массив, используя два цикла, а затем меняя символы, которые мне нужны, и после этого с помощью функций map и join Я присоединяю этот результат к одной строке. Но это лучшее решение?

спасибо.

+0

просто быть ясно, что ... результат - ваш желаемый результат? – JordanHendrix

+1

@jordanhendrix Нет, этот результат является реальным результатом javascript. Желаемый вывод имеет только одну строку '#' в середине матрицы. –

+0

@YuraYakym сообщите мне, поможет ли мое решение. –

ответ

1

Не уверен, что эффективность этого метода но Преобразование массива в строку с помощью JSON.stingify(), а затем обратно в разборе первоначальный формат на JSON.parse() заставляет объекты потерять исходную ссылку и работать без всякой боли.

var panel = new Array(3).fill(new Array(3).fill('*')); 
 
var copy = JSON.parse(JSON.stringify(panel)); 
 

 
copy[1][1] = '#'; 
 

 
//you can assign the value of variable 'copy' back to 'panel' if required. 
 

 
document.write(JSON.stringify(copy)); //for demo

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

var panel = JSON.parse(JSON.stringify(new Array(3).fill(new Array(3).fill('*')))); 
 
panel[1][1] = '#'; 
 

 
document.write(JSON.stringify(panel)); //for demo

0

Это своего рода грязный исправить, но я дам ему все равно:

var panel = new Array(3).fill(new Array(3).fill('*')); 
panel[1] = [panel[1][0],"#",panel[1][2]]; 
console.log(panel); 

/* 
Result: 
[ 
    ['*', '*', '*'], 
    ['*', '#', '*'], 
    ['*', '*', '*'] 
] 
*/ 
Смежные вопросы