Фильтруйте массив Javascript для проверки определенного значения во всех вложенных объектах. - PullRequest
2 голосов
/ 24 октября 2019

Я пытаюсь отфильтровать массив, чтобы проверить, соответствует ли определенное значение всех вложенных объектов (у меня есть элементы, содержащие другие элементы) моему условию.

Следующее работает просто отлично, но мне нужноповторять процесс до тех пор, пока не будут найдены все подходящие элементы.

// My filter
var itemsNumber = e.items.filter(function(superhero) {
    return superhero.group && superhero.group.items && superhero.group.items[0] && superhero.group.items[0].id === "1517" 


    /* I basically need to iterate the following process:

            || superhero.group && superhero.group.items && superhero.group.items[1] && superhero.group.items[1].id === "1517"

            || superhero.group && superhero.group.items && superhero.group.items[2] && superhero.group.items[2].id === "1517"

            || superhero.group && superhero.group.items && superhero.group.items[3] && superhero.group.items[3].id === "1517"

            || superhero.group && superhero.group.items && superhero.group.items[4] && superhero.group.items[4].id === "1517"

        ... And so on.

    */

});

 console.log(itemsNumber.length);

Заранее спасибо.

1 Ответ

4 голосов
/ 24 октября 2019

Вы ищете метод some:

return superhero.group &&
       superhero.group.items &&
       superhero.group.items.some(({id}) => id === "1517");

или, если вам это нужно в ES5:

return superhero.group &&
       superhero.group.items &&
       superhero.group.items.some(function(item) {
        return item.id === "1517";
       });

some вызовыего обратный вызов один раз для каждой записи в массиве и либо возвращает true в первый раз, когда обратный вызов возвращает значение truey¹, либо возвращает false, если обратный вызов никогда не возвращает истинное значение (в том числе, если в массиве вообще не было записей)). Таким образом, он проверяет, соответствует ли «некоторый» (действительно, «любой») элемент в массиве предикату, выраженному обратным вызовом.

Вот пример (в ES2015 +) для обоих случаев, когда условие истинно, и когдаэто ложь:

function check(superhero) {
    return superhero.group &&
           superhero.group.items &&
           superhero.group.items.some(({id}) => id === "1517");
}

function test(superhero, expect) {
    const result = check(superhero);
    console.log(`Checking ${JSON.stringify(superhero)}: ${result} <= ${!result === !expect ? "OK" : "ERROR"}`);
}

test({group: {items: [{id: "1"}, {id: "1517"}, {id: "9999"}]}}, true);
test({group: {items: [{id: "1"}, {id: "2"}, {id: "3"}]}}, false);

¹ «истинное значение» - «истинное» значение - это любое значение, которое не является «ложным». Значение falsy - это значение, которое оценивается как false при использовании в качестве условия (например, if (x)). Ложные значения: 0, "", null, undefined, NaN и, конечно, false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...