Скажем, у меня есть фильтр:
filter = [ {key: "pl", value: 3}, {key: "sh", value: 2} ]
Я хочу отфильтровать следующий объект javascript с указанными выше условиями фильтрации:
var data = [
{title: "The Uncertainty of the Poet ",
pl: 3,
si: 2,
va: 3,
te: 0,
co: 0,
or: 4,
sh: 2,
po: 0,
li: 0,
ar: 5
},
{
title: "Direction",
pl: 4,
si: 3,
va: 1,
te: 3,
co: 0,
or: 3,
sh: 2,
po: 0,
li: 0,
ar: 5
}
...
]
Я безуспешно пробовал следующее:
var result = data.filter(function(d){
for (item in filter) {
return d.key==d.value;
}
Я хочу вернуть объект только с записями, соответствующими условиям фильтра



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы недостаточно углубляетесь в свой for in. Он перебирает массив и не работает с каждым объектом в массиве
Можно использовать Array#every(), чтобы убедиться, что каждый объект в массиве фильтров соответствует объекту данных
// filter main data
var result = data.filter(function(dataObj){
// check if all proprties within filter array are a match
return filter.every(function(filterObj){
//compare value of property found in filterObject with value
return dataObj[filterObj.key] === filterObj.value
})
})
console.info(result)<script>
var filter = [ {key: "pl", value: 2}, {key: "sh", value: 3} ]
var data = [{
title: "The Uncertainty of the Poet ",
pl: 2,
si: 2,
va: 3,
te: 0,
co: 0,
or: 4,
sh: 3,
po: 0,
li: 0,
ar: 5
},
{
title: "Direction",
pl: 4,
si: 3,
va: 1,
te: 3,
co: 0,
or: 3,
sh: 2,
po: 0,
li: 0,
ar: 5
}
]
</script>Думаю, нам на всякий случай может потребоваться проверить, существует ли эта собственность. Что-то вроде dataObj [filterObj.key] && dataObj [filterObj.key] === filterObj.value
@KeyvanSadralodabai, если он не существует, будет просто === undefined и не будет совпадать или выдавать ошибку
@KeyvanSadralodabai Простой пример var foo = {a:1}; console.info(foo.bar)//undefined
Да, я это уже тестировал. Я удалил свой ответ, так как он не добавляет ничего полезного.
@KeyvanSadralodabai будет проблематично, только если будут задействованы вложенные свойства
Если вы хотите, чтобы он совпадал с одним или другим значением, это сработает:
match = [ {key: "pl", value: 3}, {key: "sh", value: 2} ]
var result = data.filter(function(d) {
return d.pl === match[0]['value'] || d.sh === match[1]['value']
})
Я изменил имя массива на match, чтобы избежать путаницы.
Что делать, если массив фильтров имеет 3 (или более) элемента и ключи в каждом из его объектов неизвестны?
Еще один потенциальный вариант проверить, соответствует ли объект всем критериям:
data.filter(function(obj) {
return filter.reduce(function(a, f) {
return a && (obj[f.key] === f.value);
}, true);
});
Это будет работать без проверки hasOwnProperty из-за использования уменьшать. Если вы хотите проверить, выполняется ли какое-либо из условий фильтра, вы должны изменить его на
data.filter(function(obj) {
return filter.reduce(function(a, f) {
return a || (obj[f.key] === f.value);
}, false);
});
Спасибо, sbrass. Первый сработал так, как я надеялся. Поскольку мои условия фильтрации обновляются динамически, он возвращает объект данных с записями, которые удовлетворяют всем выбранным условиям и хранятся в фильтре.
Вы также можете сделать это:
var filters = [{key: "pl", value: 3}, {key: "sh", value: 2}]
var data = [
{
title: "The Uncertainty of the Poet ",
pl: 2,
si: 2,
va: 3,
te: 0,
co: 0,
or: 4,
sh: 3,
po: 0,
li: 0,
ar: 5
},
{
title: "Direction",
pl: 3,
si: 3,
va: 1,
te: 3,
co: 0,
or: 3,
sh: 2,
po: 0,
li: 0,
ar: 5
}
]
var result = data.filter((item) => {
for(let i = 0; i < filters.length; ++i) {
let filter = filters[i];
if (item[filter.key] && item[filter.key] === filter.value) {
return true;
}
}
return false;
});
каков ваш ожидаемый результат? Вы хотите вернуть весь объект, если фильтр соответствует?