Задать вопрос
nastya97core
@nastya97core
Начинающий программист

Как проверить в начале весь массив на одно условие, а потом на другое?

Здравствуйте. У меня есть несколько массивов данных. К примеру такого вида:
["значение": "asdlkfjhasjd", "значение": "Яблоко", "значение": "adfkljahsdj", "значение": "Банан",]

В массиве может быть только Банан, либо только Яблоко, либо Банан и Яблоко, либо вообще ничего. Я перебираю массив через forEach. Мне нужен Банан, но если Банана нет, то мне нужно Яблоко. По сути мне бы подошло условие:
if (значение == Банан) {...} else if (значение == Яблоко) {...}
, но проблема в том, что Банан может быть в конце массива, но скрипт проверяет значение и видит, что Яблоко подходит и возвращает мне Яблоко. А в приоритете всегда у меня Банан. Как бы сделать так, чтобы в случае, если в массиве есть Банан, то он бы и возвращался? Но если банана нет, то искалось бы Яблоко.

И пока я писала этот вопрос, меня начал смущать момент того, что массив будет перебираться 2 раза. А он довольно большой... Как бы ещё в один перебор уместиться?
  • Вопрос задан
  • 182 просмотра
Подписаться 2 Простой 4 комментария
Решения вопроса 1
@Asokr
Используйте перебор for с выходом из цикла - если нашли банан
let item ;
for() {
if (значение == Банан) { item = banan ;  break; } 
if (значение == Яблоко) { item = Яблоко }
}
console.log(item)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@kttotto
пофиг на чем писать
На коленке, первое, что в голову пришло. Не проверял, но, думаю, смысл понятен.
const source = [ grape, plum, banana, apple ];
const required = [banan, apple];  // То, что ищем в порядке приоритета
const found = [];  // Сюда складываем то, что нашли в массиве

let result = null;

for(let fruit of source) {
    if(required[0] === fruit) {
        result = fruit;
        return;
    }

    if(required.some(d => d === fruit) {
        found.push(fruit);
    }
}

for(let item of required) {
    if(found.some(f => f === item)) {
        result = item;
        return;
    }
}
Ответ написан
Комментировать
@Mazino
инлайн вариант за 1 опциональный проход:
const fruits = []
fruits.reduce((c,v,k,a) => v == 'Банан' ? (a.splice(k), v) : v == 'Яблоко' ? v : c, null)

Если найден банан итерации прекратятся, если найдено яблоко или ничего ищем до конца
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы