условие if / else внутри foreach

#javascript #angular #typescript

#javascript #угловой #машинописный текст

Вопрос:

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

Вот мой код:

 if (this.data) {
  this.imgNotFoundText = '';
  this.data.package.files.forEach(element => {
    i  ;
    this.picture = '';
    if (element.name == this.data.properties.Name) {
      this.picture = 'picOne.png'
    }
    if (i == this.data.package.files.length amp;amp; this.picture == '') {
      this.picture = './../assets/img/notFound.jpg'
    }
  });
}
  

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

1. «он всегда извлекает всю таблицу и должен обращаться к else в течение очень короткого времени» В вашем коде нет else …?

2. При обращении за помощью лучше всего делать отступы в вашем коде согласованным, довольно стандартным способом, поскольку это помогает людям читать и понимать ваш код. (Это полезно и тогда, когда вы не обращаетесь за помощью.)

3. else является вторым, если

4. Отдельно: кажется подозрительным всегда выполнять this.picture = ''; безоговорочно в цикле. Если вы собираетесь это сделать, вы также можете посмотреть только на последнюю запись в массиве. Вероятно, вы захотите переместить это в перед forEach вызовом.

5. Нет, есть большая разница между двумя if s подряд и if / else if .

Ответ №1:

Я вижу пару возможных проблем:

  1. Кажется подозрительным всегда выполнять this.picture = ''; безоговорочно в цикле. Если вы собираетесь это сделать, вы также можете посмотреть только на последнюю запись в массиве. Вероятно, вы захотите переместить это в перед forEach вызовом.

  2. Вы ссылались на else , но в вашем коде его нет else . У вас есть два if s подряд, но результат первого if вообще не оказывает никакого влияния на второй. Возможно, вы хотели else if . Тогда второе if не выполняется, если условие в первом if было истинным.

Итак, если обе эти догадки верны:

 if (this.data) {
    this.imgNotFoundText = '';
    this.picture = '';
    this.data.package.files.forEach(element => {
        i  ;
        if (element.name == this.data.properties.Name) {
            this.picture = 'picOne.png'
        } else if (i == this.data.package.files.length amp;amp; this.picture == '') {
            this.picture = './../assets/img/notFound.jpg'
        }
    });
}
  

Примечание сбоку: Вы не показали, как i инициализируется, но если оно используется для отслеживания индекса текущей записи forEach , в этом нет необходимости: forEach получает это в качестве второго аргумента:

 if (this.data) {
    this.imgNotFoundText = '';
    this.picture = '';
    this.data.package.files.forEach((element, index) => {
    // -----------------------------^^^^^^^^^^^^^^^^
        if (element.name == this.data.properties.Name) {
            this.picture = 'picOne.png'
        } else if (index == this.data.package.files.length amp;amp; this.picture == '') {
    // ------------^^^^^
            this.picture = './../assets/img/notFound.jpg'
        }
    });
}
  

Вы также можете вообще избежать этого второго if , просто указав значение по умолчанию «не найдено» перед циклом:

 if (this.data) {
    this.imgNotFoundText = '';
    const {files} = this.data.package;
    this.picture = files.length ? './../assets/img/notFound.jpg' : '';
    files.forEach(element => {
        if (element.name == this.data.properties.Name) {
            this.picture = 'picOne.png'
        }
    });
}
  

В том, что, как я предположил, this.picture должно быть '' , если в files нет записей, или «не найдено» изображение, если есть хотя бы одна запись. Цикл перезапишет его, если найдет соответствие.

Продолжая оттуда, если в files с одним и тем же name не может быть нескольких записей, вы, вероятно, захотите остановиться на первом совпадении. Итак:

 if (this.data) {
    this.imgNotFoundText = '';
    const {files} = this.data.package;
    this.picture = files.length ? './../assets/img/notFound.jpg' : '';
    for (const {name} of files) {
        if (name == this.data.properties.Name) {
            this.picture = 'picOne.png'
            break;
        }
    }
}
  

Ответ №2:

Не уверен, какова ваша цель, но вы просто перебираете список и каждый раз устанавливаете значение picture, это означает, что в результате вы получите значение picture последнего элемента.

Если ваша цель — отобразить изображение «не найдено» для элементов, у которых нет файлов, вам нужно иметь массив изображений, который отражает массив файлов (или добавить изображение свойства к каждому файлу).

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

1. моя проблема в том, что даже у меня есть файл, в котором не найденное изображение отображается в течение короткого времени, а затем отображается правильное изображение

2. Это предполагает, что вы должны использовать временную переменную для сохранения результата и присваивать ее this.picture только после завершения цикла. Также следует использовать break оператор при первом успешном результате, как и в предыдущем ответе.

Ответ №3:

Похоже, вы можете использовать Array.prototype.some

 if (this.data) {
  this.imgNotFoundText = '';
  this.picture = this.data.package.files.some(
  (element) => element.name === this.data.properties.Name
  ) ? 'picOne.png' : './../assets/img/notFound.jpg'
}
  

Оно вернет picOne.png , если какой-либо из элементов в data.package.files имеет имя, совпадающее с this.data.properties .Назовите, иначе оно вернет notFound.jpg

Хотя это могло бы