繁体   English   中英

Javascript 等效于 LEFT OUTER JOIN 在 WHERE 子句中为 NULL

[英]Javascript equivalent to LEFT OUTER JOIN with NULL in WHERE clause

我有几个像这样的 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阵列具有不中存在formulaIDs allFormulas阵列。 基本上,相当于使用 WHERE 子句执行 LEFT OUTER JOIN 以在右侧查找 NULL。 在此处的示例数据中,预期输出为
[{formulaID: 7, lastManufactureDate: '2020-03-16'}, {formulaID: 9, lastManufactureDate: '2020-03-20'}]

在应用程序中, formulas数组中的对象数量约为 135,而在allFormulas数组中,对象数量约为 1,100。

目标是在没有第三方库的情况下有效地做到这一点。 我在这里发现了一个类似的问题但它没有解决识别一个数组中不在另一个数组中的对象的问题。 不幸的是,我真的不知道从哪里开始解决这个问题。

使用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) ,这对于大型数组来说要糟糕得多。

 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%' } ]; let preResult = formulas.map((f) => { if (!allFormulas.find((x) => x.formulaID == f.formulaID)) { return f } }); let result = preResult.filter(function(el) { return el != null; }); console.log(result);

当我们试图识别公式数组中存在但不在 allFormulas 中的项目时,我们映射公式并使用 find 方法检查该对象 ID 是否存在于 allFormulas 中。 在我们使用 map 的这个过程中,它为匹配的项目返回 undefined (因为我们只返回不匹配的项目)。 为了过滤掉 preResults 对象中未定义的内容,我们使用了过滤器。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM