Скопируйте 2D-массив в середину второго большего массива

Привет, я борюсь с копированием массива в середину другого большего массива. Я не вижу причин, по которым это не должно работать, даже если индикаторы верны. Это для https://adventofcode.com/2020/day/17. Они просят 3D-массив, но мне нужно сначала решить его с 2D-массивом.

У меня есть пустой массив, например

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

и небольшой массив

[ 
  [ 'X', '#' ], 
  [ '#', 'X' ]
]

и моя цель - поместить маленький массив в середину большого пустого, вот так

[
  [ '', '', '', '', '', '' ],
  [ '', '', '', '', '', '' ],
  [ '', '', 'X','#', '', ''],
  [ '', '', '#','X', '', ''],
  [ '', '', '', '', '', '' ],
  [ '', '', '', '', '', '' ]
]

но я получаю

[
  [ '', '', '#', 'X', '', '' ],
  [ '', '', '#', 'X', '', '' ],
  [ '', '', '#', 'X', '', '' ],
  [ '', '', '#', 'X', '', '' ],
  [ '', '', '#', 'X', '', '' ],
  [ '', '', '#', 'X', '', '' ]
]

Мой код

let square = [ [ 'X', '#' ], [ '#', 'X' ] ]
let cycles = 2;
let startWidth = square.length;//square is the small array
let finalWidth = startWidth + (cycles * 2);//cycles is part of the task it tells
let twoD = new Array(finalWidth).fill(new Array(finalWidth).fill('')); how big is the bigger array/how many spaces from the edge to the small array

if (finalWidth % 2 == 0){//just made for even numbers once I make this work will edit it for odd too
        for(let row = (finalWidth / 2) - 1; row < (finalWidth / 2) + startWidth - 1; row++){
            for(let col = (finalWidth / 2) - 1; col < (finalWidth / 2) + startWidth - 1; col++){
                let i = col - (finalWidth / 2) + 1;
                let j = row - (finalWidth / 2) + 1;
                console.info(i, j, row, col)//logs correct indecies
                twoD[row][col] = square[i][j]
            }
        }
    }

Любая идея приветствуется. Спасибо!

Чувак, дай работающий фрагмент, чтобы мы могли воспроизвести

Maheer Ali 23.12.2020 11:31

Я нигде не вижу cycles определенного. Отредактируйте код и сделайте так, чтобы он работал без ошибок.

Maheer Ali 23.12.2020 11:33

@MaheerAli сделал, что все переменные теперь объявлены там

Dalibor Trampota 23.12.2020 11:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать эту логику:

  • Создайте 2 переменные:
    • midRow: удерживать позицию x
    • midCol: удерживать позицию y
  • Затем выполните цикл по предоставленному массиву значений.
  • Используйте midRow и midCol, чтобы рассчитать позицию для записи.
  • Переопределите значение и распечатайте его

const matrix = [
  [ '', '', '', '', '', '' ],
  [ '', '', '', '', '', '' ],
  [ '', '', '', '', '', '' ],
  [ '', '', '', '', '', '' ],
  [ '', '', '', '', '', '' ],
  [ '', '', '', '', '', '' ]
]

const value = [ 
  [ 'X', '#' ], 
  [ '#', 'X' ]
]

const midRow = Math.floor((matrix.length - 1)/2)
const midCol = Math.floor((matrix[0].length - 1)/2)

for (let r = 0; r < value.length; r++) {
  for (let c = 0; c < value[0].length; c++) {
    matrix[r + midRow][c + midCol] = value[r][c]
  }
}

console.info(matrix.join('\n'))

Я также вижу, что вы используете это для создания массива:

let matrix = new Array(6).fill(new Array(6).fill(''));

Проблема с Array.fill заключается в том, что он сначала создает ценность, а затем передает ее всем элементам. Обычно это не вызывает проблем, но поскольку вы заполняете Array, вы копируете ссылку на 1 массив в 6 позиций. Следовательно, изменение одного повлияет на все

Отсюда ваша проблема:

let matrix = new Array(6).fill(new Array(6).fill(''));

matrix[2][2] = '#'

console.info(matrix.join('\n'))

Решение:

Используйте Array.from(). Это создает динамический массив, и вы можете заполнить его по своему усмотрению.

let matrix = Array.from(
  { length: 6},
  () => Array.from({length: 6}, () => '')
)

matrix[2][2] = '#'

console.info(matrix.join('\n'))

Спасибо, но что я делаю не так в своем коде?

Dalibor Trampota 23.12.2020 11:44

когда я запускаю свой код, журнал консоли записывает - i, j, row, col = 0 0 2 2 1 0 2 3 0 1 3 2 1 1 3 3, поэтому 0,0 от квадрата до 2,2 в большом массиве и так далее но пишет во всю колонку почему?

Dalibor Trampota 23.12.2020 11:46

Вместо Array.from вы также можете fill() и map(). let matrix = Array(6).fill().map(x => Array(6).fill(''))

Maheer Ali 23.12.2020 11:49

@MaheerAli Просто проверьте свою строку и посчитайте количество созданных в ней итераций и массивов.

Rajesh 23.12.2020 11:50

@MaheerAli спасибо, мне нравится эта инициализация 2d-массива, она короче и не имеет объекта с длиной, и я понимаю это лучше :)

Dalibor Trampota 23.12.2020 11:55

и какая должна быть функция, чтобы это называлось? копировать в миддл? @МахирАли

Dalibor Trampota 23.12.2020 11:57

@DaliborTrampota Да, все в порядке. копитомиддл. Я бы использовал copyToCenter.

Maheer Ali 23.12.2020 12:02

Другие вопросы по теме