У меня есть этот фрагмент, который копирует поле из массива в другое поле массива, только если account
из usersList
равна code
из 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
}
}
}
Спасибо за ваше время!
Вы можете попробовать следующее:
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 раз, а не каждую <
чек (как в вашем коде)
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;
});
Итак, конкретичность wil будет ~ O (n + m) вместо O (n * m)
Создайте индекс сортировки или непосредственно отсортируйте массив users_code
в полевом коде. Затем вы можете перечислить записи с соответствующим кодом с помощью дихотомического поиска, за которым следует линейный поиск. Это берет O(log N + K)
а не O(N)
. (N
- длина users_code
и K
- количество совпадений.)