#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:
Я вижу пару возможных проблем:
-
Кажется подозрительным всегда выполнять
this.picture = '';
безоговорочно в цикле. Если вы собираетесь это сделать, вы также можете посмотреть только на последнюю запись в массиве. Вероятно, вы захотите переместить это в передforEach
вызовом. -
Вы ссылались на
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
Хотя это могло бы