Javascript 搜索多个约束的对象数组(两个属性)

Javascript 搜索多个约束的对象数组(两个属性),javascript,arrays,filter,reduce,Javascript,Arrays,Filter,Reduce,在我问这个问题之前,我为这个糟糕的标题道歉,但我无法更好地描述它 我以这种方式创建了一个对象数组: var setitems = new Array(); setitems.push({set: "1000", item: "5000"}); setitems.push({set: "1000", item: "5010"}); setitems.push({set: "1000", item: "5020"}); setitems.push({set: "1000", item: "5050"

在我问这个问题之前,我为这个糟糕的标题道歉,但我无法更好地描述它

我以这种方式创建了一个对象数组:

var setitems = new Array();
setitems.push({set: "1000", item: "5000"});
setitems.push({set: "1000", item: "5010"});
setitems.push({set: "1000", item: "5020"});
setitems.push({set: "1000", item: "5050"});
setitems.push({set: "1010", item: "5010"});
setitems.push({set: "1010", item: "5020"});
setitems.push({set: "1010", item: "5030"});
setitems.push({set: "1020", item: "5020"});
setitems.push({set: "1020", item: "5040"});
setitems.push({set: "1020", item: "5041"});
setitems.push({set: "1030", item: "5040"});
setitems.push({set: "1030", item: "5041"});
setitems.push({set: "1030", item: "5030"});
setitems.push({set: "1040", item: "5041"});
setitems.push({set: "1040", item: "5042"});
项目和集合处于多对多关系中

还有一个简单的字符串数组,如下所示:

var itemlist = new Array();
itemlist.push("5010");
itemlist.push("5020");
// itemlist = ["5010", "5020"];
我需要知道哪些集合包含itemlist中的所有项

在本例中,它应该返回1000和1010

每套商品的数量是可变的

itemlist中的操作系统项目数是可变的


谢谢。

您可以先按集合对项目进行分组,然后检查某个集合是否包含项目列表中的每个项目。希望这有帮助

const setitems=[];
push({set:“1000”,item:“5000”});
push({set:“1000”,item:“5010”});
push({set:“1000”,item:“5020”});
push({set:“1000”,item:“5050”});
push({set:“1010”,item:“5010”});
push({set:“1010”,item:“5020”});
push({set:“1010”,item:“5030”});
push({set:“1020”,item:“5020”});
push({set:“1020”,item:“5040”});
push({set:“1020”,item:“5041”});
push({set:“1030”,item:“5040”});
push({set:“1030”,item:“5041”});
push({set:“1030”,item:“5030”});
push({set:“1040”,item:“5041”});
push({set:“1040”,item:“5042”});
常量itemlist=[];
itemlist.push(“5010”);
itemlist.push(“5020”);
常量查找=(arr,list)=>{
const group=arr.reduce((acc,val)=>({…acc,[val.set]:(acc[val.set]| |[])。concat(val.item)}),{});
返回对象.key(分组).reduce((acc,val)=>{
if(list.every(item=>grouped[val]。includes(item)))acc.push(val);
返回acc;
}, []);
};

log(find(setitems,itemlist))您可以先按集合对项目进行分组,然后检查某个集合是否包含项目列表中的每个项目。希望这有帮助

const setitems=[];
push({set:“1000”,item:“5000”});
push({set:“1000”,item:“5010”});
push({set:“1000”,item:“5020”});
push({set:“1000”,item:“5050”});
push({set:“1010”,item:“5010”});
push({set:“1010”,item:“5020”});
push({set:“1010”,item:“5030”});
push({set:“1020”,item:“5020”});
push({set:“1020”,item:“5040”});
push({set:“1020”,item:“5041”});
push({set:“1030”,item:“5040”});
push({set:“1030”,item:“5041”});
push({set:“1030”,item:“5030”});
push({set:“1040”,item:“5041”});
push({set:“1040”,item:“5042”});
常量itemlist=[];
itemlist.push(“5010”);
itemlist.push(“5020”);
常量查找=(arr,list)=>{
const group=arr.reduce((acc,val)=>({…acc,[val.set]:(acc[val.set]| |[])。concat(val.item)}),{});
返回对象.key(分组).reduce((acc,val)=>{
if(list.every(item=>grouped[val]。includes(item)))acc.push(val);
返回acc;
}, []);
};
log(find(setitems,itemlist))您可以使用实例执行此操作:

// Get an array of Set instances for entries matching itemlist entries
const [first, ...rest] = itemlist.map(item =>
    setitems.filter(entry => entry.item === item)
            .reduce((s, entry) => s.add(entry.set), new Set())
);
// Get an array of the entries in the first of those Sets that also have entries in all the rest
const result = [...first].filter(set => rest.every(s => s.has(set)));
const setitems=[];
push({set:“1000”,item:“5000”});
push({set:“1000”,item:“5010”});
push({set:“1000”,item:“5020”});
push({set:“1000”,item:“5050”});
push({set:“1010”,item:“5010”});
push({set:“1010”,item:“5020”});
push({set:“1010”,item:“5030”});
push({set:“1020”,item:“5020”});
push({set:“1020”,item:“5040”});
push({set:“1020”,item:“5041”});
push({set:“1030”,item:“5040”});
push({set:“1030”,item:“5041”});
push({set:“1030”,item:“5030”});
push({set:“1040”,item:“5041”});
push({set:“1040”,item:“5042”});
常量itemlist=[];
itemlist.push(“5010”);
itemlist.push(“5020”);
//获取与itemlist项匹配的项的集合实例数组
const[first,…rest]=itemlist.map(item=>
setitems.filter(条目=>entry.item==item)
.reduce((s,entry)=>s.add(entry.set),new set())
);
//获取这些集合中第一个集合中的条目数组,其余集合中也有条目
const result=[…first].filter(set=>rest.every(s=>s.has(set));
控制台日志(结果)您可以使用实例执行此操作:

// Get an array of Set instances for entries matching itemlist entries
const [first, ...rest] = itemlist.map(item =>
    setitems.filter(entry => entry.item === item)
            .reduce((s, entry) => s.add(entry.set), new Set())
);
// Get an array of the entries in the first of those Sets that also have entries in all the rest
const result = [...first].filter(set => rest.every(s => s.has(set)));
const setitems=[];
push({set:“1000”,item:“5000”});
push({set:“1000”,item:“5010”});
push({set:“1000”,item:“5020”});
push({set:“1000”,item:“5050”});
push({set:“1010”,item:“5010”});
push({set:“1010”,item:“5020”});
push({set:“1010”,item:“5030”});
push({set:“1020”,item:“5020”});
push({set:“1020”,item:“5040”});
push({set:“1020”,item:“5041”});
push({set:“1030”,item:“5040”});
push({set:“1030”,item:“5041”});
push({set:“1030”,item:“5030”});
push({set:“1040”,item:“5041”});
push({set:“1040”,item:“5042”});
常量itemlist=[];
itemlist.push(“5010”);
itemlist.push(“5020”);
//获取与itemlist项匹配的项的集合实例数组
const[first,…rest]=itemlist.map(item=>
setitems.filter(条目=>entry.item==item)
.reduce((s,entry)=>s.add(entry.set),new set())
);
//获取这些集合中第一个集合中的条目数组,其余集合中也有条目
const result=[…first].filter(set=>rest.every(s=>s.has(set));

控制台日志(结果)可能的解决方案可能使用两步方法

在第一步中,创建所有可能的“集合”值列表的映射/表/注册表

最后一步产生结果。它创建一个“集合”标识符列表,其中每个相关的“集合”值列表包含另一个提供的值列表的每个值

只有ES5的代码可能是这样的

var setItemList=new Array();
push({set:“1000”,item:“5000”});
设置