#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);