Функция карты для возврата 1 логического значения вместо массива логических значений

Скажем, у вас есть такой массив:

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 истину или ложь.

это должно быть java или javascript? понимаешь, что они не "одно и то же"

Stultuske 11.12.2020 08:54

Вам нужен этот второй оператор возврата, если m < 8

Stultuske 11.12.2020 08:54

@Stultuske javascript, извините, я изменил тег. И это понятно, спасибо за разъяснение!

webdesignnoob 11.12.2020 08:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
18 919
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Для чего-то подобного .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() для повышения производительности, поскольку не нужно проверять каждое значение.

ecoplaneteer 11.12.2020 09:22

@DevMaster every тоже короткое замыкание, как some

adiga 11.12.2020 09:25

@DevMaster Как отметил Адига, .every() не (всегда) проверяет каждое значение, он завершается раньше, как это делает .some(). Как только every() находит ложное значение, он останавливается и возвращает false. .some() работает наоборот, как только находит значение, равное true, останавливается и возвращает true. Если он никогда не найдет значение, для которого возвращается true, ему нужно будет перебрать весь массив.

Nick Parsons 11.12.2020 09:26

@DevMaster Спасибо за другой вариант использования .some(). Я выбрал вариант Ника, так как проект, над которым я работаю, требует от меня проверки каждого элемента. Немного другой сценарий по сравнению с тем, что я привел в качестве примера, но та же идея! Однако я буду помнить о функции .some(). Еще раз спасибо вам обоим!

webdesignnoob 11.12.2020 09:26

@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. Как только это не удовлетворяет условию, дальнейшая проверка не требуется.

adiga 11.12.2020 09:34

Самое простое решение — использовать .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) .

Другие вопросы по теме