Вложено для цикла с оператором if и 2-dim массивом javascript [duplicate]

1

Я пытаюсь найти "a" в своем 2-мя матрице, называемом arr. Используя оператор if, если есть "a", он должен установить мой размерный массив div 2 равным true в том же месте, где "a" находится в моем другом массиве arr.

var x; 
var y; 
var arr = [
        ["a", "b", "c"],
        ["d", "e", "a"],
        ["1", "2", "3"],
        ["a", "f", "d"]
    ];
var bol = new Array(4).fill(new Array(3).fill(false));
for (x = 0; x <= 3; x++) {
        for (y = 0; y <= 2; y++) {
            if (arr[x][y] == "a") {
                bol[x][y] = true;
            }
        }
    }
console.log(bol);

Я ожидаю, что это будет выглядеть так: bol

[[true, false, false],
[false, false, true],
[false, false, false],
[true, false, false]];

Однако в консоли bol выглядит так:

 [true, false, true]
 [true, false, true]
 [true, false, true]
 [true, false, true]

Пожалуйста, скажите мне, что я делаю неправильно. Спасибо!

  • 1
    fill заполняет ту же ссылку на объект, если не примитив.
Теги:
multidimensional-array
for-loop
if-statement

1 ответ

2

В то время как Array#fill заполняет массив одним и тем же объектом/примитивом, вам необходимо создать независимые массивы.

Например, с Array.from и вторым параметром для функции сопоставления, которая является другим методом Array.from.

var x, 
    y; 
    arr = [["a", "b", "c"], ["d", "e", "a"], ["1", "2", "3"], ["a", "f", "d"]],
    bol = Array.from({ length: 4 }, _ => Array.from({ length: 3}, _ => false));

for (x = 0; x <= 3; x++) {
        for (y = 0; y <= 2; y++) {
            if (arr[x][y] == "a") {
                bol[x][y] = true;
            }
        }
    }
console.log(bol);

Или сопоставьте данный массив и их вспомогательные массивы с требуемой проверкой.

var array = [["a", "b", "c"], ["d", "e", "a"], ["1", "2", "3"], ["a", "f", "d"]],
    bol = array.map(a => a.map(v => v === 'a'));

console.log(bol);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню