将数组字段更快地复制到另一个数组中

时间:2018-10-29 10:04:31

标签: javascript angular algorithm

我有一段代码,仅当account中的usersListcode中的users_code相等时,才将一个字段从一个数组复制到另一个数组字段。运行速度很慢。是否有另一种方法可以使其运行更快?

for (var i = 0; i < this.usersList.length; i++) {
    for (var j = 0; j < this.users_code.length; j++) {
        if (this.deductionsList[i].account == this.users_code[j].code) {
          this.deductionsList[i].name = this.users_code[j].name
        }
    }
}

谢谢您的时间!

3 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

for (var i = 0; i < this.usersList.length; i++) {
    var userCode = this.users_code.find(function(user){
                         return user.code === this.deductionsList[i].account;
                   });
    this.deductionsList[i].name = userCode.name;
}

我相信,查找功能比在孔阵列中发射信号要快。希望对您有帮助

答案 1 :(得分:1)

创建一个排序索引或直接对域代码上的数组users_code进行排序。然后,您可以通过二分搜索和线性搜索来枚举具有匹配代码的条目。这需要O(log N + K)个操作而不是O(N)。 (Nusers_code的长度,K是匹配的数量。)

答案 2 :(得分:0)

1)您可以获得1次长度,而不是每次<检查(如您的代码一样)

2)您可以遍历users_code并使用代码键和名称值创建对象:

const codeNames = this.users_code.reduce((result, e) => {
  result[e.code] = e.name;
  return result;
}, {});

this.usersList.forEach((e, i) => {
   this.deductionsList[i].name = codeNames[this.deductionsList[i].account] || this.deductionsList[i].name;
});

所以,兼容性将是〜O(n + m),而不是O(n * m)