Реагировать на обновление массива объекта, если объект имеет совпадающее значение в другом массиве - PullRequest
2 голосов
/ 23 апреля 2020

Я изо всех сил пытаюсь заставить работать следующее.

У меня есть массив значений:

const active = ['1', '3', '5']

Я хочу сравнить этот список с массивом объектов ( ключевой идентификатор пользователя):

[{
    userid: '1',
    username: 'peter'
}, {
    userid: '2',
    username: 'steve'
}, {
    userid: '3',
    username: 'ted'
}]

А затем создайте массив обновлений объектов, включающий активный столбец:

data = [{
    userid: '1',
    username: 'peter',
    active: true
}, {
    userid: '2',
    username: 'steve',
    active: false
}, {
    userid: '3',
    username: 'ted',
    active: true
}]

Ниже сделана попытка (извините, это хорошо mark) ...

    Object.keys(data).map((key) => {
        key.filter((userid) => data.indexOf(data.userid) => active)
    })

Я также видел это сообщение об ошибке, поэтому массив объектов должен быть расширяемым:

js map Error: An error occurred while selecting the store state: Cannot add property isApproved, object is not extensible.

Ответы [ 4 ]

1 голос
/ 23 апреля 2020

Попробуйте это:

const active = ['1', '3', '5'];

const users = [{
  userid: '1',
  username: 'peter'
}, {
  userid: '2',
  username: 'steve'
}, {
  userid: '3',
  username: 'ted'
}];

const data = users.map(user => ({
  userid: user.userid,
  username: user.username,
  active: active.includes(user.userid)
}));

console.log(data);
1 голос
/ 23 апреля 2020

вот небольшое переписывание вашего решения

const active = ['1', '3', '5']
const origData = [{
    userid: '1',
    username: 'peter'
}, {
    userid: '2',
    username: 'steve'
}, {
    userid: '3',
    username: 'ted'
}]

const data = origData.map(o => {
const newObj = o;
newObj.active = active.indexOf(o.userid) > -1
return newObj;
}


1 голос
/ 23 апреля 2020

const active = ['1', '3', '5']

const input = [{
  userid: '1',
  username: 'peter'
}, {
  userid: '2',
  username: 'steve'
}, {
  userid: '3',
  username: 'ted'
}];

const res = input.map(x => {
  const flag = active.some(y => y === x.userid)
  return {
    userid: x.userid,
    username: x.username,
    active: flag
  }
})

console.log(res)
0 голосов
/ 23 апреля 2020

использование map и includes должно упростить.

const active = ["1", "3", "5"];

const users = [
  {
    userid: "1",
    username: "peter"
  },
  {
    userid: "2",
    username: "steve"
  },
  {
    userid: "3",
    username: "ted"
  }
];

const data = users.map(x => ({ ...x, active: active.includes(x.userid) }));

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