Как вернуть массив с четным числом внутри двухмерного массива?

#javascript #loops #multidimensional-array #nested

#javascript #циклы #многомерный массив #вложенный

Вопрос:

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

 var table = [ [1,2,3,4], [1,4,2,1], [9,9,9,9], [2,4,6,8] ] // -> [2,4,6,8]
  

Я не уверен в условии if и возврате внутри цикла, но это то, что у меня есть:

 var getTable=function(arr) {
  for(var i=0; i<arr.length; i  ) {
    for(var j=0; j<arr[i].length; j  ) {
      if((arr[i][j]%2)===0) {
        return arr[i][j];
      }
    }
  }
}
  

Спасибо.

Комментарии:

1. Этот код вернет первый четный элемент, который он найдет, а именно 2. Вам нужно return arr.filter(iArr => iArr.every(e => e % 2 === 0)) , это удалит все массивы, которые не содержат всех четных чисел.

2. Наиболее подходящей функцией массива для этой задачи, вероятно, является Array#find

3. @ChrisG, спасибо за ваш ответ. Я думаю, что это оно. У меня просто возникли проблемы с его реализацией (это моя первая неделя кодирования). Я не совсем понимаю синтаксис. Что такое iArr? Я пытаюсь с return arr.filter(arr[i] => arr[i][j].every(e => e % 2 === 0)) помощью . но я получаю ошибку Неверно сформированный список параметров функции arrow

4. Я использовал короткую форму со стрелкой (и вложил вызов .every внутрь), но вы также можете передать function (iArr) { return someBooleanExpression; } . iArr это сокращение от «внутренний массив»; ключевая концепция для понимания того, как это работает здесь, заключается в том, что обычно вы вызываете существующую функцию и предоставляете свои собственные аргументы, например alert("hello") . Однако здесь вместо этого вы предоставляете функцию , поэтому вы просто называете параметры так, как вам нравится, а затем что-то с ними делаете. Более подробное объяснение: jsfiddle.net/khrismuc/xz6y51db

5. Я не уверен, о чем вы спрашиваете? Вы смотрели на скрипку из моего предыдущего комментария? Начиная со строки 19, есть три примера того, как это сделать, каждый из которых использует постепенно сокращающийся синтаксис. Строки 20-24 должны быть именно тем, что вы ищете, нет? Что значит «вы этого не поняли»? Не понял, что именно? Очень простой find() пример: jsfiddle.net/orfwtmL6

Ответ №1:

Для начального уровня у вас все в порядке.
Давайте использовать флаг при проверке каждой строки.
Мы предполагаем, что все ячейки четные, если только мы не встретим нечетную ячейку.
Мы указываем циклу ячейки for завершиться раньше на нечетной ячейке (несколько «продвинутый»).
Мы возвращаем строку, только если флаг все еще true установлен .
Если цикл строк for завершается, то все четные строки не найдены — запишите сообщение и верните пустой массив ( [] ).

Выше я обобщил комментарии из тех, которые я написал внутри кода, ниже.

 var table = [[1, 2, 3, 4], [1, 4, 2, 1], [9, 9, 9, 9], [2, 4, 6, 8]];

function getEvenRow(arr) {
  var allEven; // flag
  for (var i = 0; i < arr.length; i  ) {
    allEven = true; // set flag to true before each row
    // stop checking row on first not even cell
    for (var j = 0; j < arr[i].length amp;amp; allEven; j  ) {
      if ((arr[i][j] % 2) != 0) { // check if *not* even
        allEven = false; // not even: set flag to false
      }
    }
    if (allEven) { // was the row all even
      return arr[i]; // it was: return it (function terminates)
    }
  }
  // if we got here, none are all even.  javascript will automatically return `undefined`
  // you can console.log a message before that and return an empty array - like this:
  console.log("getEvenRow says: All even row not found");
  return [];
}

// console.log(getEvenRow(table));
// using this modification for S.O. snippet:
console.log(JSON.stringify(getEvenRow(table)));
console.log("-".repeat(40)); // just to separate the outputs

var table2 = [[1, 2, 3, 4], [1, 4, 2, 1], [9, 9, 9, 9], [2, 4, 6, 111]];

console.log(JSON.stringify(getEvenRow(table2)));