Извлечение объектов из массива путем передачи ключа и значения в JavaScript - PullRequest
2 голосов
/ 11 июля 2019

Это мой массив объектов. Я хочу отфильтровать объекты, передав запрос в функции.

const products = [{
    name: "A",
    color: "Blue",
    size: 50
  },
  {
    name: "B",
    color: "Blue",
    size: 60
  },
  {
    name: "C",
    color: "Black",
    size: 70
  },
  {
    name: "D",
    color: "Green",
    size: 50
  }
];

Мой желаемый вывод, который будет фильтроваться из запроса, который я передаю в функцию, которая может быть чем угодно

{
  name: "A",
  color: "Blue",
  size: 50
}, {
  name: "C",
  color: "Black",
  size: 70
}

Это мой объект запроса, который я передам в функцию

const filter = {
  color: ["Blue", "Black"],
  size: [70, 50]
};

Это моя функция, которую я могу назначить другой переменной и использовать для дальнейших операций

const filteredData = filterIt(products, filter);

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Вот еще один вариант:

function filterIt(products, filter) {
  return products.filter(p => {
    for (const k in filter) {
      if (filter[k].indexOf(p[k]) === -1) {
        return false;
      }
    }
    return true;
  })
}

См. Демо

Если вы хотите сделать ИЛИ вместо И влогика, измененная предыдущей функцией:

function filterIt(products, filter) {
  return products.filter(p => {
    for (const k in filter) {
      // if a value of any property of the product is contained in a filter array, include it
      if (filter[k].indexOf(p[k]) !== -1) {
        return true;
      }
    }
    return false;
  })
}

См. Демо и для этого:)

1 голос
/ 11 июля 2019

Вы можете получить записи объекта фильтра и получить ключ и значение для проверки с помощью includes.

const
    filterBy = filter => o => Object.entries(filter).every(([k, v]) => v.includes(o[k])),
    filterIt = (array, filter) => array.filter(filterBy(filter)),
    products = [{ name: "A", color: "Blue", size: 50 }, { name: "B", color: "Blue", size: 60 }, { name: "C", color: "Black", size: 70 }, { name: "D", color: "Green", size: 50 }],
    filter = { color: ["Blue", "Black"], size: [70, 50] },
    filteredData = filterIt(products, filter);

 console.log(filteredData);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 11 июля 2019

const products = [{
    name: "A",
    color: "Blue",
    size: 50
  },
  {
    name: "B",
    color: "Blue",
    size: 60
  },
  {
    name: "C",
    color: "Black",
    size: 70
  },
  {
    name: "D",
    color: "Green",
    size: 50
  }
];
const filter = {
  color: ["Blue", "Black"],
  size: [70, 50]
};


let filterIt = (products, filter) => {

  return products.filter(p => {
    
    //get all filter keys
    let keys = Object.keys(filter);
    
    let validkeys = [];
    
    keys.forEach(k=>{
      // check if filter property exist and includes filter value
      if(p.hasOwnProperty(k) && filter[k].includes(p[k])){
        validkeys.push(true);
      }
      
    })
    
    //check all filter matches
    return validkeys.length === keys.length;
    
  });

}

const filteredData = filterIt(products, filter);
console.log("...filteredData", filteredData);
...