我目前正在解决组合两个数组的优化问题。问题如下:
- 我有 2 个不同大小的数组,其中数组 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 是否出现来过滤第二个数组 (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))
关于javascript - JS Array NEQ 操作的最佳性能操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67936903/