Скажем, у вас есть такой массив:
arrayExample = [1, 2, 3, 4, 5, 6, 7]
Я хочу использовать функцию карты для итерации через arrayExample и возвращать true, если все числа меньше 8, и false, если это не так. Однако, когда я это делаю, я получаю массив истин (например: [true, true, true... и т. д.])
Смогу ли я вернуть только 1 значение?
Вот мой код:
var testBoolean = true;
var array = [1,2,3,4,5,6,7];
testBoolean = array.map(m => {
//if a number in the array is >=8, changes the testBoolean to false and return false only
if (m >= 8)
{
return false;
}
//VS code said I had to have a return here, I believe its because I need to have in case m < 8 (edited after reading a comment)
return true;
})
//prints an array [true,true,true,true,true,true,true]
document.write(testBoolean);
Я немного новичок в «карте», но я считаю, что он делает это, поскольку возвращает значение для каждого элемента, просто не понимаю, как сделать так, чтобы он возвращал 1 истину или ложь.
Вам нужен этот второй оператор возврата, если m < 8
@Stultuske javascript, извините, я изменил тег. И это понятно, спасибо за разъяснение!
Для чего-то подобного .map()
не подходит. .map()
предназначен для преобразования всех элементов вашего массива в новые элементы (т. е. сопоставления каждого элемента с новым преобразованным значением). В результате .map()
всегда будет возвращать массив (если это поведение не изменено намеренно). Вместо этого вы можете использовать для этого .every(), который сообщит вам, соответствуют ли все элементы в вашем массиве вашему условию (т.е. если ваша функция возвращает true для каждого элемента, тогда вы получите true как результат, иначе вы получите ложь). Метод .every()
завершится раньше, как только найдет один элемент, для которого ваша функция обратного вызова возвращает false
, что может повысить эффективность:
const array = [1, 2, 3, 4, 5, 6, 7];
const testBoolean = array.every(m => {
if (m >= 8) {
return false;
}
return true;
});
console.info(testBoolean);
Это можно записать более кратко, просто вернув результат m < 8
(это будет оцениваться как true
или false
)
const array = [1,2,3,4,5,6,7];
const testBoolean = array.every(m => m < 8);
console.info(testBoolean);
@NickParsons Я настоятельно рекомендую использовать .some()
для повышения производительности, поскольку не нужно проверять каждое значение.
@DevMaster every
тоже короткое замыкание, как some
@DevMaster Как отметил Адига, .every()
не (всегда) проверяет каждое значение, он завершается раньше, как это делает .some()
. Как только every()
находит ложное значение, он останавливается и возвращает false. .some()
работает наоборот, как только находит значение, равное true
, останавливается и возвращает true
. Если он никогда не найдет значение, для которого возвращается true
, ему нужно будет перебрать весь массив.
@DevMaster Спасибо за другой вариант использования .some(). Я выбрал вариант Ника, так как проект, над которым я работаю, требует от меня проверки каждого элемента. Немного другой сценарий по сравнению с тем, что я привел в качестве примера, но та же идея! Однако я буду помнить о функции .some(). Еще раз спасибо вам обоим!
@DevMaster, вы можете легко это проверить: вы можете запустить [1,2,3,4,5].every(a => { console.info(a); return a < 3 })
или использовать запятую [1,2,3,4,5].every(a => (console.info(a), a < 3) )
. Он будет регистрироваться только до 3
. Как только это не удовлетворяет условию, дальнейшая проверка не требуется.
Самое простое решение — использовать .some()
.
Нам не нужно проверять каждое значение. Нам нужно найти первое значение не меньше 8.
const array = [1, 2, 3, 4, 5, 6, 7]
const testBoolean = !array.some(m => m >= 8)
console.info(testBoolean)
С более общей точки зрения, если вы хотите вернуть одно значение из массива, .reduce()
— ваш друг.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
В частности, в вашем случае вы можете сделать
array.reduce(function(accumulator, currentVal, i, arr) {
return accumulator && currentVal < 8;
}, true));
Итак, .reduce()
перебирает ваш массив с начальным значением true
и возвращает «предыдущее» значение (накопитель) И является ли текущее значение меньше 8.
Вы могли бы думать об этом как
(true && (a[0] < 8 && (a[1] < 8 ... )))
Возвращаемое значение на каждой итерации становится accumulator
следующей. Таким образом, вы могли бы не только выполнять математические операции, но и изменять массив определенной формы (например, массив объектов {w:0, h:0}
) на результат другого (например, одно число, являющееся суммой всех гипотенуз, вычисленных из каждого w
и h
) .
это должно быть java или javascript? понимаешь, что они не "одно и то же"