javascript - 搜索对象数组(两个属性)以查找多个限制

标签 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"});
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"];

我需要知道哪些集合包含项目列表中的所有项目。

在此示例中,它应返回 1000 和 1010。

每组的项目数量是可变的。

项目列表中的操作系统项目数是可变的。

谢谢。

最佳答案

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

const setitems = [];
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"});

const itemlist = [];
itemlist.push("5010");
itemlist.push("5020");

const find = (arr, list) => {

    const grouped = arr.reduce((acc, val) => ({ ...acc, [val.set]: (acc[val.set] || []).concat(val.item) }), {});

    return Object.keys(grouped).reduce((acc, val) => {
        
        if (list.every(item => grouped[val].includes(item))) acc.push(val);
        
        return acc;
        
    }, []);
};

console.log(find(setitems, itemlist));

关于javascript - 搜索对象数组(两个属性)以查找多个限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53006465/

相关文章:

javascript - 如何用数字数组过滤对象数组

excel - 文本过滤器对两个字符串,但排除一些可能性

javascript - 限制表单提交的次数

javascript - 使用javascript将文本插入文本区域而不用javascript解析文本

java - 没有数组名称的 JSONArray(地震示例)

arrays - 如何处理 Angular 7 中数据不均匀的 JSON 对象?

javascript - 为什么我无法在 javascript 中访问 forEach() 内的数组

javascript - 如何使用 JavaScript 传输图像

javascript - 未捕获的类型错误 : Assignment to constant variable

Wordpress login_redirect 过滤器被忽略并且无效