Array.every() работает только с первым элементом

у меня есть массив

errorPriority: string[] = ['shippingError', 'paymentInfoError', 'generalError'];

Мне нужно, чтобы вызов функции зацикливался на каждом элементе массива, но каким-то образом после выполнения функции для первого элемента «shippingError» цикл останавливается. Ниже приведен вызов функции

this.errorPriority.every(this.getErrorData);

И функция, которая выполняется

getErrorData = (value: string): void => {
    if (eval(this.objectPath[value as keyof ObjectPath]) && eval(this.objectPath[value as keyof ObjectPath]).length)
      this.checkoutState.errors[value] = eval(this.objectPath[value as keyof ObjectPath]);
  }

Иногда это работает с элементом массива, но в основном останавливается после первого элемента. Я что-то упустил, пожалуйста, помогите

Я ожидаю, что функция должна быть зациклена на каждом элементе массива

Используйте forEach, а не every. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

R. Richards 23.11.2022 14:16

Я могу измениться, но по какой причине происходит описанный выше сценарий?

Manoj G 23.11.2022 14:18

Вы уверены, что понимаете всех? пожалуйста, проверьте developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

programandoconro 23.11.2022 14:18

Пожалуйста, прочитайте документацию для каждого. Вы ничего не возвращаете, поэтому он возвращает undefined. Undefined не соответствует действительности.

epascarello 23.11.2022 14:20

Также использование eval не очень хорошая практика. Обычно есть лучшие способы сделать что-то.

epascarello 23.11.2022 14:21

Понял возвращаемую часть, @epascarello - есть ли у вас какие-либо предложения для eval, потому что это строка, на которую я должен ссылаться для пути

Manoj G 23.11.2022 14:22
stackoverflow.com/questions/6491463/…
epascarello 23.11.2022 14:25

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

JSEvgeny 23.11.2022 14:28
Поведение ключевого слова "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) для оценки ваших знаний,...
1
8
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы используете каждую функцию, она просто проверит, успешно ли ВСЕ элементы вашего массива передают вашу функцию. Таким образом, данная функция ДОЛЖНА возвращать логическое значение (true или false), но вы возвращаете void. попробуйте вернуть "true", если ваше условие успешно

getErrorData = (value) => {
    if (eval(this.objectPath[value]) && eval(this.objectPath[value]).length) {
      this.checkoutState.errors[value] = eval(this.objectPath[value]);
      return true;
    }
  }

изменился таким образом, getErrorData = (значение: строка): ObjectPath => { if (eval(this.objectPath[значение в качестве ключа ObjectPath]) && eval(this.objectPath[значение в качестве ключа ObjectPath]).length) this.checkoutState. ошибки [значение] = eval (this.objectPath [значение в качестве ключа пути к объекту]); return eval(this.objectPath[значение как keyof ObjectPath]); };

Manoj G 23.11.2022 14:25

это все равно прервется после того, как первый элемент не соответствует критериям, forEach - это безопасный способ поразить каждый элемент в массиве

jigfox 23.11.2022 14:29

Метод every() проверяет, проходят ли все элементы массива тест, реализованный предоставленной функцией. Он возвращает логическое значение.

Источник

это означает, что Array#every() проверяет, соответствует ли каждый элемент в массиве критериям, проверенным данной функцией, и это означает, что данная функция должна возвращать логическое значение. Поскольку ваша функция возвращает void или в javascript undefined, это будет интерпретироваться как false. А поскольку every возвращает true только в том случае, если все элементы возвращают истинное значение, итерация может быть прервана после первого ложного значения.

чтобы запустить ваш код на every элементе, вам нужно использовать forEach

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

из документации MDN определение array.every()

Метод Every() проверяет, все ли элементы в массиве проходят проверку. реализуется предоставленной функцией. Он возвращает логическое значение.

поэтому array.every возвращает логическое значение. в вашем коде вы ничего не возвращаете. если условие истинно, вы только назначаете новое свойство.

должно работать следующее:

   getErrorData = (value) => {
    if (eval(this.objectPath[value]) && eval(this.objectPath[value]).length) {
      this.checkoutState.errors[value] = eval(this.objectPath[value]);
      return true;
    }
      return false
    }

это не будет постоянно поражать каждый элемент, оп попросил способ запустить метод для каждого элемента

jigfox 23.11.2022 14:30

return false бессмысленно, потому что возврат ничего означает возврат undefined (ложное значение, интерпретируемое как false), поэтому не беспокойте вас, чтобы вернуть false

Paul-Marie 23.11.2022 14:37

@ Поль-Мари, ты прав. ему не нужно явно возвращать false, но лично мне нравится быть настолько явным, насколько я могу :)

laian 23.11.2022 16:13

@laian, может быть, я неправильно понял: «Я ожидаю, что функция должна зацикливаться на каждом элементе массива» 🤷🏼‍♂️

jigfox 23.11.2022 17:09

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