Скопируйте поле массива в другой массив быстрее

1

У меня есть этот фрагмент, который копирует поле из массива в другое поле массива, только если 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
        }
    }
}

Спасибо за ваше время!

Теги:
angular
algorithm

3 ответа

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) вы можете получить длину 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)

0

Создайте индекс сортировки или непосредственно отсортируйте массив users_code в полевом коде. Затем вы можете перечислить записи с соответствующим кодом с помощью дихотомического поиска, за которым следует линейный поиск. Это берет O(log N + K) а не O(N). (N - длина users_code и K - количество совпадений.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню