JavaScript - сложность для приведенных ниже исполнений (forEach против forEach-indexOf) - PullRequest
0 голосов
/ 04 марта 2020

Постановка задачи: - arr1 - упорядоченный массив со значениями 3,4 и 5. В списке, показанном ниже, все объекты, свойство "c" которых совпадает со свойством элементов массива, должны быть обновлены с помощью index + 1 из найденного индекса на arr1.

У меня есть два разных способа достижения того же, какой из них имеет лучшую временную сложность, и какой следует выбрать?

var arr1 = [3,4,5];
var list = [{a:1,b:2,c:3},{a:1,b:2,c:3},{a:2,b:3,c:5},{a:3,b:4,c:4}];
output: [{a:1,b:2,c:1},{a:1,b:2,c:1},{a:2,b:3,c:3},{a:3,b:4,c:3}];

1: найти индекс и затем обновить индекс:

list.forEach((obj) => {
  var i = arr1.indexOf(obj.c);
  if(i > -1) {
     obj.c = i +1;
  }
});
Использование двух циклов forEach.
arr1.forEach((id,index) => {
  list.forEach((obj) => {
     if(obj.c === id){
       obj.c = index+1;
     }
  })
});

Какой способ лучше написать и почему?

1 Ответ

0 голосов
/ 04 марта 2020

Можно взять Map со значением и индексом заранее, с одним l oop.

и еще одним l oop для всех элементов list где c получает обновление при необходимости.


Экземпляр Map - это структура данных, поддерживающая отношение ключ-значение с быстрым доступом O (1) к значению.

var array = [3, 4, 5],
    list = [{ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 }, { a: 2, b: 3, c: 5 }, { a: 3, b: 4, c: 4 }],
    values = new Map;

array.forEach(Map.prototype.set, values);

list.forEach(o => {
    if (values.has(o.c)) o.c = values.get(o.c) + 1;
});

console.log(list);
...