как отфильтровать массив по условию, подобному предложению SQL IN, используя Lodash?

#javascript #ecmascript-6 #lodash

#javascript #ecmascript-6 #Lodash

Вопрос:

Я пытаюсь отфильтровать данные, которые присутствуют в массиве, используя Lodash. Я пытаюсь фильтровать как SQL В предложении.

 ex: - select * from Test where id IN (2,4,5,67); 
  

JSON:

 storedData = [
    {
        "id" : 1,
        "name" : "ABC"
    },
    {
        "id" : 2,
        "name" : "XYZ"
    },
    {
        "id" : 3,
        "name" : "BVX"
    },
    {
        "id" : 4,
        "name" : "OOO"
    }
]
  

Критерии поиска:

 [2,4,5,67]
  

Требуемый вывод:

 output = [
    {
        "id" : 2,
        "name" : "XYZ"
    },
    {
        "id" : 4,
        "name" : "OOO"
    }
]
  

Ниже приведен мой код, который я пытался реализовать

 output = _.filter(storedData, (value) => {
    return value.id == 2 || value.id == 4 || value.id == 5 || value.id == 67
});
  

Не могли бы вы, пожалуйста, помочь мне, как фильтровать, как В предложении?

Ответ №1:

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

Смотрите пример ниже:

 const storedData = [ { "id" : 1, "name" : "ABC" }, { "id" : 2, "name" : "XYZ" }, { "id" : 3, "name" : "BVX" }, { "id" : 4, "name" : "OOO" } ];
const search = [2,4,5,67];

const res = _.intersectionWith(storedData, search, (o, n) => o.id === n); 
console.log(res);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>  

Ответ №2:

Использовать .includes

 _.filter(storedData, (value) => _.includes(criteria, value.id))
  

 const storedData = [
  {
    id: 1,
    name: "ABC",
  },
  {
    id: 2,
    name: "XYZ",
  },
  {
    id: 3,
    name: "BVX",
  },
  {
    id: 4,
    name: "OOO",
  },
]

const criteria = [2, 4, 5, 67]

const output = _.filter(storedData, (value) => _.includes(criteria, value.id))

console.log(output)  
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>