筛选具有多个属性的对象数组结果为空

时间:2019-06-22 03:42:23

标签: javascript arrays object ecmascript-6 ecmascript-7

这是我尝试获得具有多个属性的结果。但结果总是空数组。

有人在这里告诉我正确和最小的方法吗?我也没有其他过滤条件。

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.

Live Demo here

3 个答案:

答案 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.entriesArray.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的值(我们希望记录过滤键与空字符串匹配),并且实际值是否与当前过滤的对象键的值匹配。