作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个像这样的 JS 对象:
var formulas = [
{formulaID: 1, lastManufactureDate: '2020-03-24'},
{formulaID: 3, lastManufactureDate: '2020-03-20'},
{formulaID: 7, lastManufactureDate: '2020-03-16'},
{formulaID: 9, lastManufactureDate: '2020-03-20'}
];
var allFormulas = [
{formulaID: 1, formulaName: 'Chocolate Milk 2%'},
{formulaID: 2, formulaName: 'Chocolate Milk 1%'},
{formulaID: 3, formulaName: 'Vanilla Creamer'},
{formulaID: 4, formulaName: 'Hazelnut Creamer'},
{formulaID: 5, formulaName: 'Plain Creamer'},
{formulaID: 6, formulaName: 'White Milk 2%'}
];
我需要找到一种方法来识别 formulas
数组中具有 allFormulas
数组中不存在的 FormulaID 的所有对象。基本上,相当于使用 WHERE 子句执行 LEFT OUTER JOIN 来查找右侧的 NULL。在此处的示例数据中,预期输出为 [{formulaID: 7, lastManufactureDate: '2020-03-16'}, {formulaID: 9, lastManufactureDate: '2020-03-20'} ]
在应用中,formulas
数组中的对象数量约为 135 个,而 allFormulas
数组中的对象数量约为 1,100 个。
我们的目标是在没有第三方库的情况下高效地完成此操作。我发现了类似的问题here但它没有解决识别一个数组中不存在于另一个数组中的对象的问题。不幸的是,我真的不知道从哪里开始解决这个问题。
最佳答案
使用 allFormulas
id 构建一个集合,然后过滤第一个数组。
var ids = new Set(allFormulas.map(f => f.formulaID));
var result = formulas.filter(f => !ids.has(f.formulaID));
复杂度为 O(N+M)(每个数组迭代一次,查找一组的时间应该为 O(1))。基于嵌套循环的解决方案(使用线性搜索,例如 find
)是 O(N*M),这对于大型数组来说要差得多。
关于Javascript 相当于 WHERE 子句中带有 NULL 的 LEFT OUTER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60839365/
我是一名优秀的程序员,十分优秀!