#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))
помощью . но я получаю ошибку Неверно сформированный список параметров функции arrow4. Я использовал короткую форму со стрелкой (и вложил вызов .every внутрь), но вы также можете передать
function (iArr) { return someBooleanExpression; }
.iArr
это сокращение от «внутренний массив»; ключевая концепция для понимания того, как это работает здесь, заключается в том, что обычно вы вызываете существующую функцию и предоставляете свои собственные аргументы, напримерalert("hello")
. Однако здесь вместо этого вы предоставляете функцию , поэтому вы просто называете параметры так, как вам нравится, а затем что-то с ними делаете. Более подробное объяснение: jsfiddle.net/khrismuc/xz6y51db5. Я не уверен, о чем вы спрашиваете? Вы смотрели на скрипку из моего предыдущего комментария? Начиная со строки 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)));