Скопируйте поле массива в другой массив быстрее - PullRequest
0 голосов
/ 29 октября 2018

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

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

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Вы можете попробовать следующее:

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;
}

Я считаю, что функция поиска быстрее, чем итерация по массиву отверстий. Надеюсь, это поможет

0 голосов
/ 29 октября 2018

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

0 голосов
/ 29 октября 2018

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...