Как использовать критерии фильтра массива объекта agaist в lodash? - PullRequest
1 голос
/ 31 мая 2019

Как отфильтровать объект или другой объект в lodash? но объектом критерия является массив ..

var form = { type: ['xyz', 'abc'], name: 'pre-1' }

var items = [
 { type: 'xyz', name: 'pre-1' },
 { type: 'abc', name: 'pre-1' }, 
 { type: 'xyz', name: 'pre-2' }, 
]

const results = lodash.filter(items, form);

results должно быть xyz и abc:

results = [{ type: 'xyz', name: 'pre-1' }, { type: 'abc', name: 'pre-1' }]

Это то, что я могу сделать, используя метод filter?

Ответы [ 5 ]

1 голос
/ 31 мая 2019

Ну, вы можете использовать пользовательский метод фильтрации с lodash. Попробуйте ниже:

var form = { type: ['xyz', 'abc'], name: 'pre-1' }

var items = [
 { type: 'xyz', name: 'pre-1' },
 { type: 'abc', name: 'pre-1' }, 
 { type: 'xyz', name: 'pre-2' }, 
]

let filtered = _.filter(items, (item)=>{
    return form.type.indexOf(item.type) >= 0 && form.name == item.name
});

console.log(filtered);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 01 июня 2019

Простой в чистом виде JS:

var form = { type: ['xyz', 'abc'], name: 'pre-1' }

var items = [
 { type: 'xyz', name: 'pre-1' },
 { type: 'abc', name: 'pre-1' }, 
 { type: 'xyz', name: 'pre-2' }, 
]

const res = items.filter(({ type, name }) => form.type.includes(type) && form.name == name);

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Если вы действительно хотите, вы можете использовать метод Лодаша _.filter, например:

var form = { type: ['xyz', 'abc'], name: 'pre-1' }

var items = [
 { type: 'xyz', name: 'pre-1' },
 { type: 'abc', name: 'pre-1' }, 
 { type: 'xyz', name: 'pre-2' }, 
]

const res = _.filter(items, ({ type, name }) => form.type.includes(type) && form.name == name);

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 31 мая 2019

Если вы reduce отправляете свои предметы на карту объектов, где предметы можно найти по комбинации type и name, то это может быть простая карта на key с или без lodash:

var form = { type: ['xyz', 'abc'], name: 'pre-1' }

var items = [
 { type: 'xyz', name: 'pre-1' },
 { type: 'abc', name: 'pre-1' }, 
 { type: 'xyz', name: 'pre-2' }, 
].reduce((r,c) => (r[`${c.type}-${c.name}`] = c, r), {}) // convert to object map

let result = form.type.map(t => items[`${t}-${form.name}`]) // map by key

console.log(result)

С lodash вы можете использовать _.keyBy и _.map:

var form = { type: ['xyz', 'abc'], name: 'pre-1' }

var items = _.keyBy([
 { type: 'xyz', name: 'pre-1' },
 { type: 'abc', name: 'pre-1' }, 
 { type: 'xyz', name: 'pre-2' }, 
], x => `${x.type}-${x.name}`)

let result = _.map(form.type, t => items[`${t}-${form.name}`])

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Таким образом, с точки зрения производительности вы находитесь на территории O(N).

0 голосов
/ 31 мая 2019

Проверьте, если form.name === item.name, и если это так, используйте Array.includes(), чтобы проверить, появляется ли item.type в form.type.

Примечание. Я использовал ванильный JS-фильтр и включает методы, но вы можете заменить их на _.filter() и _.includes().

от lodash.

const form = { type: ['xyz', 'abc'], name: 'pre-1' }

const items = [{"type":"xyz","name":"pre-1"},{"type":"abc","name":"pre-1"},{"type":"xyz","name":"pre-2"}]

const result = items.filter(item =>
  form.name === item.name && form.type.includes(item.type)
)

console.log(result)

Другой вариант с lodash - использовать _.intersectionWith(), и в функции comperator проверить, совпадает ли имя элемента с именем формы, и тип существует в типах.

const form = { type: ['xyz', 'abc'], name: 'pre-1' }

const items = [{"type":"xyz","name":"pre-1"},{"type":"abc","name":"pre-1"},{"type":"xyz","name":"pre-2"}]

const result = _.intersectionWith(items, form.type, (item, type) =>
  form.name === item.name && item.type === type
)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 31 мая 2019
var form = { type: ['xyz', 'abc'], name: 'pre-1' }

var items = [
 { type: 'xyz', name: 'pre-1' },
 { type: 'abc', name: 'pre-1' }, 
 { type: 'xyz', name: 'pre-2' }, 
]

var item = _.filter(items, i => {
 return form.type.indexOf(i.type) > -1 && form.name === i.name
});

console.log(item)
...