У меня есть огромная коллекция данных, насчитывающая более 700 элементов, и я хочу фильтровать по динамическому массиву объектов. Допустим, пользователь набрал ode
, и мой скрипт должен выполнять поиск по каждому фильтру без выполнения чего-то вроде {{X1 } }
const hugeData = [{name:"store 1",code : "code 1", available : false},{name : "store 2",code : "simple_code",available : true},{name : "sto 3",code : "has no cde",available : true}...]
const filters = [{ code : "ode", name : "re" }]
Результат, который я ожидаю,
// output
[{name : "store 1", code : "code 1", available : false},{name : "store 2",code : "simple_code",available : true}]
Я решил это, выполнив следующее с lodash
, но функция очень медленная, а код плохой, есть ли другой способ сделать это?
const results = []
_.map(hugeData, store => {
_.map(filters, tag => {
Object.keys(tag).map(tagOb => {
if (store[tagOb] && store[tagOb].includes(tag[tagOb])) {
results.push(store);
}
});
});
});
2 ответа
Вы можете использовать filter
и some
const hugeData = [{ name: "store 1", code: "code 1",available: false}, { name: "store 2", code: "simple_code",available: true}, { name: "sto 3", code: "has no cde", available: true }]
const filters = { code: "ode", name: "re" }
let final = hugeData.filter(value => {
return Object.entries(value).some(([key, value]) => {
return typeof value == 'string' && value.includes(filters[key])
})
})
console.log(final)
Это может быть быстрее - сохранить результат Object.keys()
и отфильтровать все ключи, которых нет в первом хранилище (при условии, что все хранилища эквивалентны). Я также использовал один объект для filters
.
const hugeData = [
{ name: "store 1", code: "code 1", available: false },
{ name: "store 2", code: "simple_code", available: true },
{ name: "sto 3", code: "has no cde", available: true }
];
const filters = { code: "ode", name: "re" };
const keys = Object.keys(filters).filter(k => hugeData[0].hasOwnProperty(k));
console.log(
hugeData.filter(s => keys.some(k => s[k].includes(filters[k])))
);
Если вы хотите, чтобы ВСЕ фильтры соответствовали, вы можете изменить его на every
:
hugeData.filter(s => keys.every(k => s[k].includes(filters[k])))
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.