[英]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.