@AlexandrMa

Как сделать фильтрацию массива?

let products = [
 {
  id: 101,
  brand_id: 1,
  params: [1,2,3]
 },
 {
  id: 102,
  brand_id: 2,
  params: [4,5]
 },
  {
   id: 103,
   brand_id: 3
  }
 ];

 //Объект поиска. Может как содержать свойсва brands и params, так нет.
 let s = {
  brands: [1,2],
  params: [4]
 }

 //Вариант1
 //Тут не получилось, хотел сразу в одном фильтре сделать.
 let result = products.filter(product =>
  (s.hasOwnProperty("brands") && s.brands.includes(product.brand_id)) &&
  (s.hasOwnProperty("params") && product.hasOwnProperty("params"))
 );
 
 //Вариант2
 //тут все работает
 if(s.hasOwnProperty("brands") && s.brands.length > 0){
  products = products.filter(product =>
   s.brands.includes(product.brand_id)
  );
 }

 //тут не работает, потому что у продукта массив params, а не int.
 if(s.hasOwnProperty("params") && s.params.length > 0){
  products = products.filter(product =>
   product.hasOwnProperty("params") && s.params.includes(product.params)
  );
 }
 //тут я не понял как переписать s.params.includes(product.params)


Помогите дописать скрипт.
1. Надо переписать s.params.includes(product.params), чтобы поиск был по внутреннему массиву.
2. В идеале, соединить все в один filter. Там где у меня не получилось (Вариант1)

Результат по
let s = {
  brands: [1,2],
  params: [4]
 }

должен быть 102
  • Вопрос задан
  • 89 просмотров
Решения вопроса 2
@serpres
Нужно добавить еще одно условие, которое проверяет, содержит ли массив product.params хотя бы один элемент из массива s.params. Для этого можно использовать метод
Array.some()

Примерно так:
let result = products.filter(product => {
  let matchBrand = s.hasOwnProperty("brands") && s.brands.includes(product.brand_id);
  let matchParams = s.hasOwnProperty("params") && 
  product.hasOwnProperty("params") && 
  product.params.some(param => s.params.includes(param));
  return matchBrand && matchParams;
});
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Про метод массива some уже написали выше.
Я бы еще вынес некоторые условия из итерации:
const brandsPredicate = s.hasOwnProperty("brands") && s.brands.length > 0
  ? product => s.brands.includes(product.brand_id)
  : () => true;
const paramsPredicate = s.hasOwnProperty("params") && s.params.length > 0
  ? product => product.hasOwnProperty("params") &&
    s.params.some(param => product.params.includes(param))
  : () => true;

const result = products.filter(product => brandsPredicate(product) && paramsPredicate(product));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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