javascript - JS Array NEQ 操作的最佳性能操作

标签 javascript arrays algorithm performance filter

我目前正在解决组合两个数组的优化问题。问题如下:

  • 我有 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/

相关文章:

javascript - 无法从 cssnano 配置中关闭 colormin 优化

javascript - 对象值仅在数组的第一个元素中增加

c++ - 排列中的升序子序列

javascript - 将 JSON 文件加载到 highcharts 中以绘制折线图

javascript - grunt-autoprefixer 设置

PHP:合并两个数组,第一个键不同,第二个键求和

ruby - 如何根据订单快速重新排序 Ruby 数组?

c++ - 使用带有 max_element 的 lambda 函数编译错误

algorithm - 阅读网格算法和网格库

javascript - JQuery 中的选项卡创建菜单