@reactreact

Как изменить значение свойства объекта в зависимости от другого объекта?

Есть массив с объектами, допустим:
this.items = [
      {name : 'Petya', id: 1, active: false},
      {name : 'Vasjya', id: 2, active: false},
      {name : 'Dima', id: 3, active: false},
      {name : 'Lena', id: 4, active: false},
      {name : 'Katya', id: 5, active: false}
    ];

И есть такой массив с объектами:
this.items = [
      {name : 'Dima', id: 3},
      {name : 'Lena', id: 5},
    ];


Так вот: если в первом массиве у объектов совпадают id из другого массива с объектами, то тогда в первом нужно заменить active: false на active: true. То есть исходя из массивов выше, нужно получить по итогу такой:
this.items = [
      {name : 'Petya', id: 1, active: false},
      {name : 'Vasjya', id: 2, active: false},
      {name : 'Dima', id: 3, active: true},
      {name : 'Lena', id: 4, active: false},
      {name : 'Katya', id: 5, active: true}
    ];


Как такое лучше всего сделать? Спасибо.
  • Вопрос задан
  • 5028 просмотров
Решения вопроса 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Можно использовать indexBy из lodash/underscore для первого массива, этот хелпер преобразует массив в объект используя в качестве ключей определенное поле из вложеных в массив объектов
Так как объекты в js передаются по ссылке, то объекты в индексе и в массиве будут связаны
После пробегаем второй массив циклом и меняем значения в первом
Примерно так:
this.items = [
      {name : 'Petya', id: 1, active: false},
      {name : 'Vasjya', id: 2, active: false},
      {name : 'Dima', id: 3, active: false},
      {name : 'Lena', id: 4, active: false},
      {name : 'Katya', id: 5, active: false}
    ];
    this.itemsIndex = _.indexBy(this.items, 'id');

    this.items2 = [
      {name : 'Dima', id: 3},
      {name : 'Lena', id: 5},
    ];
    this.items2.forEach(el => {
        if(el.id in this.itemsIndex) {
            this.itemsIndex[el.id].active = true;
        }
    });
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Выбираем все id из второго списка.
Проходим по первому списку, и если айди уже засветился, делаем active = true

ZOFNueS.png

https://jsfiddle.net/fdfsgkz2/

А если первый массив можно изменять, то даже так: https://jsfiddle.net/fdfsgkz2/1/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
VIKINGVyksa
@VIKINGVyksa
front-end developer
Обычный массив в массиве, подругому если делать то надо будет исходные массивы менять
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы