JS Array NEX操作的最佳性能操作



Im目前正在处理组合两个数组的优化问题。问题如下:

  • 我有两个不同大小的阵列,阵列A在所有情况下都比阵列B小(大多数情况下大小不同(
  • 数组A中包含具有两个ID的对象
[{
AccountID: "1234141",
ContactID: "1256612"
},{
AccountID: "2346278",
ContactID: "2378898"
}, ...]
  • 数组B包含具有简单键值对的对象。每个对象还包含数组A中包含的一个或两个ID
[{
AccountID: "1234141",
Name: "Peter Peterson",
Contact: "Mail",
...
},
{
ContactID: "2378898",
Name: "Max Mustermann",
Contact: "Phone",
...
},
...
]
  • 在执行算法之前,应该用作比较的ID字段的名称是已知的(例如AccountID、ContactID(在代码示例中,该参数被称为";idKeyName">
  • 算法应该在两个数组上计算一个不相等运算符。因此,它应该返回数组B,而不包含数组a中在上面指定的字段中具有相同ID的元素

遗留代码是这样的:

jQuery.each(arrayA, function (index, value, array) {
if (arrayA[index][idKeyName] !== "" && list.indexOf(arrayA[index][
idKeyName
]) === -1)
list.push(arrayA[index][idKeyName]);
});
jQuery.each(arrayB, function (index, value, array) {
if (list.indexOf(arrayB[index][idKeyName]) === -1) {
results.push(value);
}
});

正如您所看到的,性能非常差,因为数组必须运行两次
我对代码的改进使我得出了以下结论:

arrayA.forEach(function (oItem) {
var iIndex = arrayB.findIndex(function (x) {
return oItem[idKeyName] === x[idKeyName];
});
if (iIndex !== -1) {
arrayB.splice(iIndex, 1);
}
});

由于ArrayA比ArrayB小,我对其进行了遍历,而不是例如过滤ArrayB,希望重复次数最少。如果我发现当前元素连接到ArrayB中的一个元素(相同的ID(,我会将其从ArrayB拼接出来。最后,我只需要返回ArrayB作为结果。

问题:是否有更好(更快性能(的方法在两个阵列上计算此NEQ运算符?

谢谢你的帮助!

两种解决方案中的问题都是需要为数组B中的每个项迭代数组A

相反,从第一个数组(A(的相关id创建一个Set,然后通过检查相关id是否出现在Set:中来过滤第二个数组(b(

const fn = key => (arrA, arrB) => {
const arrASet = new Set(A.map(o => o[key]))

return arrB.filter(o => !arrASet.has(o[key]))
}
const A = [{"AccountID":"1234141","ContactID":"1256612"},{"AccountID":"2346278","ContactID":"2378898"}]
const B = [{"AccountID":"1234141","Name":"Peter Peterson","Contact":"Mail"},{"ContactID":"2378898","Name":"Max Mustermann","Contact":"Phone"}]
const filterByAccountID = fn('AccountID')
const filterByContactID = fn('ContactID')
console.log(filterByAccountID(A, B))
console.log(filterByContactID(A, B))

最新更新