Замена значения массива с соответствующим идентификатором - PullRequest
2 голосов
/ 17 октября 2019

У меня есть массив объектов людей, который содержит:

  • идентификатор (от лица)
  • имя (от лица)
  • лайков (идентификатор человека, которого они любят)

.

array = [{ id:1, name:"Adam", likes:2 },{ id:2, name:"Ben", likes:3 },{ id:3, name:"Cindy", likes:1 }];

В последнем массиве идентификатор человека, которого они любят, заменяется его именем

array = [{ id:1, name:"Adam", likes:"Ben" },{ id:2, name:"Ben", likes:"Cindy" },{ id:3, name:"Cindy", likes:"Adam" }];

Текущее решение:

for(let i=0;i<array.length;i++){
    for(let j=0;array.length;j++){
        if(array[i].likes == array[j].id){
            array[i].likes = array[j].name;
        };
    };
};

Есть ли более эффективный способ сделать это, кроме использования 2 циклов?

Ответы [ 3 ]

5 голосов
/ 17 октября 2019

Вот способ O (n):

 const byID = new Map(array.map(u => [u.id, u]));

 for(const u of array)
   u.likes = byID.get(u.likes);

При построении карты в O (n), поиск получает O (1), таким образом, вся операция выполняется в O (n) +O (1 * n) = O (n).

2 голосов
/ 17 октября 2019

Я думаю, что два отдельных цикла лучше, чем вложенный цикл

let array = [{ id:1, name: 'Adam', likes:2 },{ id:2, name: 'Ben', likes:3 },{ id:3, name: 'Cindy', likes:1 }];
let ids = array.reduce((acc, {id, name}) => (acc[id] = name, acc), {});
array.forEach(item => item.likes = ids[item.likes]);
console.log(array);
0 голосов
/ 17 октября 2019

Используйте forEach и filter

let array = [{ id:1, name:' Adam', likes:2 },{ id:2, name: 'Ben', likes:3 },{ id:3, name: 'Cindy', likes:1 }];
array.forEach(function(e){
e.likes=array.filter(function(x){return x.id==e.likes})[0].name
})
console.log(array)
...