Javascript: увеличение элемента массива для цикла for при работе с вложенными циклами и двумерными массивами - PullRequest
0 голосов
/ 24 октября 2019

У меня есть массив массивов, который выглядит следующим образом:

matrix = [[0,1,1,2], [0,5,0,0], [2,0,3,3]]

Я хотел перебрать этот вложенный массив и сравнить элементы из каждого массива с их аналогами в других массивахто есть сравните 5 (1-й элемент) во втором массиве с 1 (1-й элемент) в первом массиве и 0 (1-й элемент) в третьем массиве. Я хочу проверить, имеет ли элемент в текущем массиве, на который я смотрю, аналог в одном из других массивов, равный 0.

Так что в основном я хочу сравнить [0] [0] с [1] [0] и [2] [0], [0] [1] - [2] [1] и [3] [1] и т. Д. Во вложенном цикле for.

Вотто, что я пытался:

function matrixElementsSum(matrix) {
    let total = 0;
    let arr = [];

    for(let i = 0; i < matrix.length; i++) {
        for(let j = 0; j < matrix[i].length; j++) {
            if(matrix[i][j] != 0 && matrix[i + 1][j] != 0) {
                console.log(matrix[i][j]);
            }
        }
    }  
}

Эта часть оператора if приводит к ошибке undefined: && matrix[i + 1][j] != 0

В обычном цикле / для цикла for мы можем увеличивать iсравнить текущий элемент со следующим элементом. Как сделать это во вложенном цикле for при работе с массивом массивов?

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Вместо вложенных циклов вы можете использовать протокол итераций ES6 и захватывать все итераторы из внутренних массивов, а затем использовать их вывод до завершения. Это может упростить вашу работу с данными, потому что на каждой итерации у вас есть только текущий последовательный элемент из каждого массива:

function compareAll(matrix) {
  //get all the iterators for sub-arrays
  const iterators = matrix.map(sub => sub[Symbol.iterator]());

  while(true) {
    //advance all iterators and take theur results
    let res = iterators.map(it => it.next());
    
    //terminate if any is done
    if (res.some(r => r.done)) break;
    
    //get the values
    let currentValues = res.map(({value}) => value);

    //do something with them
    const allEqual = currentValues.every(function(value) {
      return value === this;
    }, currentValues[0]);
    console.log(currentValues, allEqual);
  }
}


compareAll([[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]]);
0 голосов
/ 25 октября 2019

Если подмассивы имеют одинаковую длину, вам нужно только перебрать элементы первого подмассива и сравнить их с их аналогами. Если я вас правильно понимаю, я думаю, что это сделает это за вас:

var matrix =  [[0,1,1,2], [0,5,0,0], [2,0,3,3]]
var len = matrix[0].length
var flatArray = matrix.flat()
for(let index=0;index<len;index++){
if(flatArray[index] !== 0 && flatArray[index + len] !== 0 && flatArray[index 
+ 2*len] !== 0)
console.log(index,flatArray[index])
}
...