这是我尝试获得具有多个属性的结果。但结果总是空数组。
有人在这里告诉我正确和最小的方法吗?我也没有其他过滤条件。
nestedFilter = (targetArray, filters) => {
var filterKeys = Object.keys(filters);
return targetArray.filter(function (eachObj) {
return filterKeys.every(function (eachKey) {
return filters[eachKey].includes(eachObj[eachKey]);
});
});
};
//filter 1
let filter1 = {
color: "Blue",
size:'70'
};
//filter 2
let filter2 = {
name:'',
color: "Blue",
size:'70'
};
//filter 3
let filters = {
name:'',
color: "",
size:''
};
let 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 },
];
var results = nestedFilter(products, filter2);
console.log(results); //getting alwasy empty.
答案 0 :(得分:0)
如果任何一个值匹配,则需要使用一些产品,使其包含在输出中
let 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},];
let filter1 = {color: "Blue",size: '70'};
let filter2 = {name: '',color: "Blue",size: '70'};
let filters = {name: '',color: "",size: ''};
const nestedFilter = (targetArray, filters) => {
var filterKeys = Object.keys(filters);
return targetArray.filter(function(eachObj) {
return filterKeys.some(function(eachKey) {
return filters[eachKey].includes(eachObj[eachKey]);
});
});
};
console.log(nestedFilter(products, filter1))
console.log(nestedFilter(products, filter2))
console.log(nestedFilter(products, filters))
答案 1 :(得分:0)
您应该使用some
而不是every
。还要注意,您可以利用嵌套的返回值和其他功能来使代码更简洁。
const nestedFilter = (targetArray, filters) => targetArray.filter(o => Object.keys(filters).some(k => filters[k].includes(o[k]) || filters[k] == ""));
let filter1 = {color:"Blue",size:'70'};
let filter2 = {name:'',color:"Blue",size:'70'};
let filters = {name:'',color:"",size:''};
let 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},];
console.log(nestedFilter(products, filter1));
console.log(nestedFilter(products, filter2));
console.log(nestedFilter(products, filters));
.as-console-wrapper { max-height: 100% !important; top: auto; }
答案 2 :(得分:0)
您也可以使用Object.entries和Array.filter解决此问题 和Array.some这样:
let 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 },
];
let filter1 = { color: 'Blue', size: '70' }
let filter2 = { name: '', color: 'Blue', size: '60' }
let filter3 = { name: '', color: '', size: '' }
let nestedFilter = (arr, filter) => {
let fE = Object.entries(filter)
return arr.filter(f => fE.some(([k,v]) => !v || f[k].toString().includes(v)))
}
console.log(nestedFilter(products, filter1)) // 3 objects
console.log(nestedFilter(products, filter2)) // 4 objects
console.log(nestedFilter(products, filter3)) // 4 objects
想法是获取正在使用的过滤器的entries
,然后使用其键/值检查是否首先没有对我们来说true
的值(我们希望记录过滤键与空字符串匹配),并且实际值是否与当前过滤的对象键的值匹配。