Оптимизировать вложенный цикл и оператор if в JavaScript - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть оператор if внутри двух вложенных циклов for в моем коде JavaScript, как показано ниже.

Проблема заключается в том, что выполнение замедляется, когда мне приходится сравнивать тысячи объектов в массиве, поскольку цикл повторяется по всему массиву только для проверки единственного совпадающего значения.

Когда ключ в объекте данных совпадает с идентификатором объекта из массива arr, он добавляет ключ имени пользователя к объектам в массиве arr.

Пожалуйста, запустите следующий код и посмотрите вывод:

var data = { 1: 'John',
  2: 'Josehp',
  8: 'Marley',
  3: 'George',
  4: 'Stella',
  5: 'Stanley',
  123: 'Juhi'
}



var arr = [ { id: '1'
   },
  { id: '2'
  },
  { id: '10'
    },
  { id: '3'
    },
  { id: '4'
    },
  { id: '13'
    },
  { id: '5'
    }
];

var x;
for (x in data) {
	for (i = 0; i < arr.length; i++) {
	if (arr[i].id == x) {
	arr[i].username = data[x];
	}
     }
  }
console.log(arr)

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

Ответы [ 7 ]

1 голос
/ 02 апреля 2019

может быть что-то подобное поможет?

arr.forEach((user) => {
    if (data[user.id] !== undefined) {
        user.username = data[user.id]
    }
});
1 голос
/ 02 апреля 2019
var data = { 1: 'John', 2: 'Josehp', 8: 'Marley', 3: 'George', 4: 'Stella', 5: 'Stanley', 123: 'Juhi' },
array = [ { id: '1' }, { id: '2' }, { id: '10' }, { id: '3' }, { id: '4' }, { id: '13' }, { id: '5' }],
i;

for (var m in array){
 array[m].username = data[array[m].id]
}

console.log(array);
1 голос
/ 02 апреля 2019

Просто используйте map с троичным оператором и разбрасыванием:

var data = { 1: 'John', 2: 'Josehp', 8: 'Marley', 3: 'George', 4: 'Stella', 5: 'Stanley', 123: 'Juhi'}

var arr = [{id: '1'},{id: '2'},{id: '10'},{id: '3'},{id: '4'},{id: '13'},{id: '5'}];

arr = arr.map(e => data[e.id] ? { ...e, username: data[e.id] } : e);

console.log(arr)
.as-console-wrapper { max-height: 100% !important; top: auto; }
1 голос
/ 02 апреля 2019

Вы можете использовать Array.prototype.map и троичный .

var data = { 1: 'John',
  2: 'Josehp',
  8: 'Marley',
  3: 'George',
  4: 'Stella',
  5: 'Stanley',
  123: 'Juhi'
}



var arr = [ { id: '1'
   },
  { id: '2'
  },
  { id: '10'
    },
  { id: '3'
    },
  { id: '4'
    },
  { id: '13'
    },
  { id: '5'
    }
];

let out = arr.map(({id}) => (data[id]? {id, username: data[id]}: {id}));
console.log(out)
1 голос
/ 02 апреля 2019

data - это хеш с id в качестве ключа, поэтому доступ к его элементам по id - это операция O(1).

Это означает, что вы можете иметь один цикл через переменную arrсделать ваш алгоритм линейным (O(n)):

for (let i = 0; i < arr.length; i++ )
  if ( data[arr[i].id] )
    arr[i].username = data[arr[i].id]
1 голос
/ 02 апреля 2019

Вы можете просто пройтись по массиву arr и установить имя пользователя каждого элемента на основе свойства data с тем же ключом.

var data = {
  1: 'John',
  2: 'Josehp',
  8: 'Marley',
  3: 'George',
  4: 'Stella',
  5: 'Stanley',
  123: 'Juhi'
};

var arr = [{ id: '1' },
{ id: '2' },
{ id: '10' },
{ id: '3' },
{ id: '4' },
{ id: '13' },
{ id: '5' }];


arr.forEach(function(item) {
  item.username = data[item.id];
});
console.log(arr);
1 голос
/ 02 апреля 2019

Вы можете взять один цикл и проверить, существует ли объект, и обновить массив.

var data = { 1: 'John', 2: 'Josehp', 8: 'Marley', 3: 'George', 4: 'Stella', 5: 'Stanley', 123: 'Juhi' },
    array = [ { id: '1' }, { id: '2' }, { id: '10' }, { id: '3' }, { id: '4' }, { id: '13' }, { id: '5' }],
    i;

for (i = 0; i < array.length; i++) {
    if (array[i].id in data) {
        array[i].username = data[array[i].id];
    }
}

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...