Как я могу фильтровать объект по элементам внутри массива внутри объекта?

#javascript #api #postman

Вопрос:

Я играл, пытаясь учиться в проекте API с помощью Postman и проводил тесты с использованием JavaScript. До сих пор мне это удавалось с помощью чтения на веб-сайтах и просмотра видео на YouTube. Конечно, предыдущие тесты и игры были довольно простыми, но теперь я остановился. Я действительно пытался понять это в течение нескольких недель, но мне нужны дальнейшие указания, толчок в правильном направлении или прямая помощь.

То, что я пытаюсь сделать, — это отфильтровать некоторые ответы только для просмотра объектов, содержащих определенные данные.

Для этого я использую фильтр, в котором я хочу, чтобы все продукты содержали определенное значение в массиве «product_option_values».

Мой первый подход состоял в том, чтобы посмотреть, смогу ли я отсортировать продукты, имеющие какие-либо значения, из первого массива, и это сработало. Он отлично фильтруется.

 var filterSmall = jsonData.products.filter(fs => fs.associations.product_option_values);
 

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

Я также пробовал другие подходы, такие как:

 var filterSmall = jsonData.products.filter(fs => fs.associations["product_option_values", 0, "name"] === "S");
 

и другие подобные комбинации.

Это очень сокращенный образец структуры «продуктов», которая в своем полном виде состоит из 20 продуктов и гораздо большего количества значений внутри нее:

 {
"products": [
    {
        "id": 16,
        "manufacturer_name": "Graphic Corner",
        "quantity": "0",
        "price": "12.900000",
        "indexed": "1",
        "name": "Mountain fox notebook",
        "associations": {
            "categories": [
                {
                    "id": "2"
                },
                {
                    "id": "6"
                }
            ],
            "product_option_values": [
                {
                    "id": "22"
                },
                {
                    "id": "23"
                }
            ]
        }
    },
    {
        "id": 17,
        "manufacturer_name": "Graphic Corner",
        "quantity": "0",
        "price": "12.900000",
        "indexed": "1",
        "name": "Brown bear notebook",
        "associations": {
            "categories": [
                {
                    "id": "2"
                },
                {
                    "id": "6"
                }
            ],
            "product_option_values": [
                {
                    "id": "23"
                },
                {
                    "id": "24"
                }
            ]
        }
    }
]
 

}

а вот небольшой и расширенный образец из product_option_values:

 {
"product_option_values": [
    {
        "id": 1,
        "id_attribute_group": "1",
        "color": "",
        "position": "0",
        "name": "S"
    },
    {
        "id": 2,
        "id_attribute_group": "1",
        "color": "",
        "position": "1",
        "name": "M"
    },
    {
        "id": 3,
        "id_attribute_group": "1",
        "color": "",
        "position": "2",
        "name": "L"
    }
]
 

}

Как мне действовать дальше? Сделал ли я что-нибудь правильное или даже близкое к этому?

Возможно, я слишком долго на это пялился.

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

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

1. Как small sample from product_option_values массив соотносится с исходным products массивом? Являются ли они разными вещами, или первое является расширенной версией того, что на самом деле содержится во втором?

2. Извините, я должен был упомянуть об этом, это только расширенная версия.

3. Итак, цель состоит в том, чтобы отфильтровать продукты для получения подмножества продуктов, в котором есть один или несколько product_option_values продуктов с именем «S» (представляющим малый)?

4. Цель состоит в том, чтобы отфильтровать количество продуктов с определенными значениями из product_option_values. Например, сколько продуктов имеют product_option_values.id 1

Ответ №1:

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

 const jsonData = {
"products": [
    {
        "id": 16,
        "manufacturer_name": "Graphic Corner",
        "quantity": "0",
        "price": "12.900000",
        "indexed": "1",
        "name": "Mountain fox notebook",
        "associations": {
            "categories": [
                {
                    "id": "2"
                },
                {
                    "id": "6"
                }
            ],
            "product_option_values": [
                {
                    "id": "22"
                },
                {
                    "id": "23"
                }
            ]
        }
    },
    {
        "id": 17,
        "manufacturer_name": "Graphic Corner",
        "quantity": "0",
        "price": "12.900000",
        "indexed": "1",
        "name": "Brown bear notebook",
        "associations": {
            "categories": [
                {
                    "id": "2"
                },
                {
                    "id": "6"
                }
            ],
            "product_option_values": [
                {
                    "id": "23"
                },
                {
                    "id": "24"
                }
            ]
        }
    }
]
};

const sample = {
"product_option_values": [
    {
        "id": 22,
        "id_attribute_group": "1",
        "color": "",
        "position": "0",
        "name": "S"
    },
    {
        "id": 2,
        "id_attribute_group": "1",
        "color": "",
        "position": "1",
        "name": "M"
    },
    {
        "id": 3,
        "id_attribute_group": "1",
        "color": "",
        "position": "2",
        "name": "L"
    }
]
};

const ids = sample.product_option_values.map((el) => String(el.id));
console.log(ids);

const filtered = jsonData.products.filter((fs) => fs.associations.product_option_values.map((e) => e.id).some((f) => ids.includes(f)));

console.log(filtered);