Javascript 如何使用ES2016按多个条件过滤对象数组?

Javascript 如何使用ES2016按多个条件过滤对象数组?,javascript,Javascript,我尝试了上面的代码,但无法根据过滤条件进行过滤。筛选结果应与预期结果匹配 非常感谢您的帮助或任何参考。您可以借助以下工具减少过滤器(其中返回的累加器是应用其中一个提供的过滤器后旧累加器的过滤版本): 函数多重过滤器(阵列、过滤器){ 返回Object.entries(filters).reduce((acc[k,v])=>{ //对于合格的产品,它应至少符合以下条件之一: //此属性的筛选器为“k” 返回acc.filter(a=>v.some(f=>f.id==a[k].id)) },数组)

我尝试了上面的代码,但无法根据过滤条件进行过滤。筛选结果应与预期结果匹配


非常感谢您的帮助或任何参考。

您可以
借助以下工具减少过滤器(其中返回的累加器是应用其中一个提供的过滤器后旧累加器的过滤版本):

函数多重过滤器(阵列、过滤器){
返回Object.entries(filters).reduce((acc[k,v])=>{
//对于合格的产品,它应至少符合以下条件之一:
//此属性的筛选器为“k”
返回acc.filter(a=>v.some(f=>f.id==a[k].id))
},数组);
}
让产品=[
{name:“A”,fabricColor:{“id:'BLUE'},图案:{'id':'PLAID'},尺寸:50},
{name:“B”,fabricColor:{“id:'BLUE'},图案:{'id':'WINDOWPANE'},大小:60},
{name:“C”,fabricColor:{“id:'BLUE'},图案:{'id':'SOLID'},大小:100},
{name:“D”,fabricColor:{“id:'BLACK'},图案:{'id':'PLAID'},尺寸:70},
{name:“E”,fabricColor:{“id:'BLACK'},图案:{'id':'WINDOWPANE'},大小:80},
{name:“F”,fabricColor:{“id:'BLACK'},图案:{'id':'SOLID'},大小:100},
{名称:“G”,面料颜色:{“id”:“绿色”},图案:{“id”:“格子”},尺寸:90},
{name:“H”,fabricColor:{“id:'GREEN'},图案:{'id':'SOLID'},大小:100},
{name:“I”,fabricColor:{“id:'GREEN'},图案:{'id':'WINDOWPANE'},大小:80}
];
让过滤器={
fabricColor:[{“id”:“蓝色”},{“id”:“黑色”}],
图案:[{'id':'PLAID'},{'id':'WINDOWPANE'}]
};
过滤var=多重过滤器(产品、过滤器);

console.log(过滤)您可以借助于减少过滤器(其中返回的累加器是应用提供的其中一个过滤器后旧累加器的过滤版本):

函数多重过滤器(阵列、过滤器){
返回Object.entries(filters).reduce((acc[k,v])=>{
//对于合格的产品,它应至少符合以下条件之一:
//此属性的筛选器为“k”
返回acc.filter(a=>v.some(f=>f.id==a[k].id))
},数组);
}
让产品=[
{name:“A”,fabricColor:{“id:'BLUE'},图案:{'id':'PLAID'},尺寸:50},
{name:“B”,fabricColor:{“id:'BLUE'},图案:{'id':'WINDOWPANE'},大小:60},
{name:“C”,fabricColor:{“id:'BLUE'},图案:{'id':'SOLID'},大小:100},
{name:“D”,fabricColor:{“id:'BLACK'},图案:{'id':'PLAID'},尺寸:70},
{name:“E”,fabricColor:{“id:'BLACK'},图案:{'id':'WINDOWPANE'},大小:80},
{name:“F”,fabricColor:{“id:'BLACK'},图案:{'id':'SOLID'},大小:100},
{名称:“G”,面料颜色:{“id”:“绿色”},图案:{“id”:“格子”},尺寸:90},
{name:“H”,fabricColor:{“id:'GREEN'},图案:{'id':'SOLID'},大小:100},
{name:“I”,fabricColor:{“id:'GREEN'},图案:{'id':'WINDOWPANE'},大小:80}
];
让过滤器={
fabricColor:[{“id”:“蓝色”},{“id”:“黑色”}],
图案:[{'id':'PLAID'},{'id':'WINDOWPANE'}]
};
过滤var=多重过滤器(产品、过滤器);

console.log(过滤)
您可以
过滤
您的结果,如下所示

let产品=[
{name:“A”,fabricColor:{“id:'BLUE'},图案:{'id':'PLAID'},尺寸:50},
{name:“B”,fabricColor:{“id:'BLUE'},图案:{'id':'WINDOWPANE'},大小:60},
{name:“C”,fabricColor:{“id:'BLUE'},图案:{'id':'SOLID'},大小:100},
{name:“D”,fabricColor:{“id:'BLACK'},图案:{'id':'PLAID'},尺寸:70},
{name:“E”,fabricColor:{“id:'BLACK'},图案:{'id':'WINDOWPANE'},大小:80},
{name:“F”,fabricColor:{“id:'BLACK'},图案:{'id':'SOLID'},大小:100},
{名称:“G”,面料颜色:{“id”:“绿色”},图案:{“id”:“格子”},尺寸:90},
{name:“H”,fabricColor:{“id:'GREEN'},图案:{'id':'SOLID'},大小:100},
{name:“I”,fabricColor:{“id:'GREEN'},图案:{'id':'WINDOWPANE'},大小:80}
];
//应用的过滤器
让过滤器={
fabricColor:[{“id”:“蓝色”},{“id”:“黑色”}],
图案:[{'id':'PLAID'},{'id':'WINDOWPANE'}]
};
让res=products.filter(d=>Object.entries(filters).every([k,v])=>
Object.values(v.map(m=>m.id).includes(d[k].id)))

console.log(res)
你可以
过滤你的结果,如下所示

let产品=[
{name:“A”,fabricColor:{“id:'BLUE'},图案:{'id':'PLAID'},尺寸:50},
{name:“B”,fabricColor:{“id:'BLUE'},图案:{'id':'WINDOWPANE'},大小:60},
{name:“C”,fabricColor:{“id:'BLUE'},图案:{'id':'SOLID'},大小:100},
{name:“D”,fabricColor:{“id:'BLACK'},图案:{'id':'PLAID'},尺寸:70},
{name:“E”,fabricColor:{“id:'BLACK'},图案:{'id':'WINDOWPANE'},大小:80},
{name:“F”,fabricColor:{“id:'BLACK'},图案:{'id':'SOLID'},大小:100},
{名称:“G”,面料颜色:{“id”:“绿色”},图案:{“id”:“格子”},尺寸:90},
{name:“H”,fabricColor:{“id:'GREEN'},图案:{'id':'SOLID'},大小:100},
{name:“I”,fabricColor:{“id:'GREEN'},图案:{'id':'WINDOWPANE'},大小:80}
];
//应用的过滤器
让过滤器={
fabricColor:[{“id”:“蓝色”},{“id”:“黑色”}],
图案:[{'id':'PLAID'},{'id':'WINDOWPANE'}]
};
让res=products.filter(d=>Object.entries(filters).every([k,v])=>
Object.values(v.map(m=>m.id).includes(d[k].id)))

console.log(res)
d预期结果是什么?let expected=[{name:“A”,fabricColor:{“id”:“BLUE”},图案:{id:“PLAID”},大小:50},{name:“B”,fabricColor:{“id”:“BLUE”},图案:{id:“WINDOWPANE”},大小:60},{name:“d”,fabricColor:{“id”:“BLACK”},图案:{id:“PLAID”},大小:70},{name:“E”,fabricColor:{“id”:'BLACK'},图案:{'id':'WINDOWPANE'},大小:80}];预期结果是什么?let expected=[{name:“A”,fabricColor:{“id”:“BLUE”},pattern:{id':
// all products
let products = [
  { name: "A", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'PLAID'}, size: 50 },
  { name: "B", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'WINDOWPANE'}, size: 60 },
  { name: "C", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'SOLID'}, size: 100 },
  { name: "D", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'PLAID'}, size: 70 },
  { name: "E", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'WINDOWPANE'}, size: 80 },
  { name: "F", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'SOLID'}, size: 100 },
  { name: "G", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'PLAID'}, size: 90 },
  { name: "H", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'SOLID'}, size: 100 },
  { name: "I", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'WINDOWPANE'}, size: 80 }
];

// filters applied
let filters = {
  fabricColor: [{"id": 'BLUE'}, {"id": 'BLACK'}],
  pattern: [{'id': 'PLAID'}, {'id': 'WINDOWPANE'}]
};


var filtered = multiFilter(products, filters);


/**
 * Multi-filter an array of objects
 * @param  {Array}  array  : list of elements to apply a multiple criteria filter
 * @param  {Object} filters: Contains multiple criteria filters by the property names of the objects to filter
 * @return {Array}
 */
function multiFilter(array, filters) {
  let filterKeys = Object.keys(filters);
  // filters all elements passing the criteria
  let filterData = array.filter((item) => filterKeys.every((key) => (filters[key].indexOf(item[key]) !== -1)));
  return filterData
}



 // expected result 
let expected = [
  { name: "A", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'PLAID'}, size: 50 },
  { name: "B", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'WINDOWPANE'}, size: 60 },
  { name: "D", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'PLAID'}, size: 70 },
  { name: "E", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'WINDOWPANE'}, size: 80 }
];