Слияние в массив объектов из объекта по ключу - PullRequest
0 голосов
/ 08 октября 2018

Моя цель - обновить массив объектов путем сопоставления id с другим объектом, содержащим соответствующий ключ, для обновления ключа value массива объектов.

Работа с массивом объектов, например:

const objArr = [
  {
    id: 6,
    name: 'Activity Attendance',
    type: 'Number',
    value: '2000',
    nameChanged: false,
    typeChanged: false,
    internalName: 'activity_attendance'
  },
  {
    id: 123,
    name: 'Total Number of Interacted Consumers',
    type: 'Number',
    value: '400',
    nameChanged: false,
    typeChanged: false,
    internalName: 'total_number_of_interacted_consumers'
  },
  {
    id: 140,
    name: 'Booth Location',
    type: 'Select (Single Answer)',
    value: '',
    nameChanged: false,
    typeChanged: false,
    internalName: 'booth_location'
  }
];

И такой объект, как:

const obj = {
  '6': '1500',
  '123': '180',
  '140': ''
};

Желаемый результат:

const objArr = [
  {
    id: 6,
    name: 'Activity Attendance',
    type: 'Number',
    value: '1500',
    nameChanged: false,
    typeChanged: false,
    internalName: 'activity_attendance'
  },
  {
    id: 123,
    name: 'Total Number of Interacted Consumers',
    type: 'Number',
    value: '180',
    nameChanged: false,
    typeChanged: false,
    internalName: 'total_number_of_interacted_consumers'
  },
  {
    id: 140,
    name: 'Booth Location',
    type: 'Select (Single Answer)',
    value: '',
    nameChanged: false,
    typeChanged: false,
    internalName: 'booth_location'
  }
];

Я пошел по пути отображения objArr, но не уверен вкак перейти к «соответствию» в пределах obj, чтобы получить правильное значение для обновления.Моя неудачная попытка:

objArr.map(i => i.id.includes(Object.keys(obj).map(o => Number(o))));

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

Ответы [ 5 ]

0 голосов
/ 08 октября 2018

Вы можете использовать следующий пример для решения вашей проблемы:

objArr.forEach(i => i.value = Object.keys(obj).includes(String(i.id)) ? obj[i.id]: i.value);
0 голосов
/ 08 октября 2018

Вот решение с использованием функции map() и оператора расширения (...):

var objArr = [
  {
    id: 6,
    name: 'Activity Attendance',
    type: 'Number',
    value: '2000',
    nameChanged: false,
    typeChanged: false,
    internalName: 'activity_attendance'
  },
  {
    id: 123,
    name: 'Total Number of Interacted Consumers',
    type: 'Number',
    value: '400',
    nameChanged: false,
    typeChanged: false,
    internalName: 'total_number_of_interacted_consumers'
  },
  {
    id: 140,
    name: 'Booth Location',
    type: 'Select (Single Answer)',
    value: '',
    nameChanged: false,
    typeChanged: false,
    internalName: 'booth_location'
  }
];

var obj = {
  '6': '1500',
  '123': '180',
  '140': ''
};

console.log(objArr.map(i => ({
  ...i,
  value: obj[i.id] ? obj[i.id] : i.value 
})))
0 голосов
/ 08 октября 2018

В простом javascript я бы сделал что-то вроде этого

objArr.forEach(element => {
  let value = obj[parseInt(element.id)];
  if(value){
    element.value = value;
  }
});
0 голосов
/ 08 октября 2018

Вы можете сделать это следующим образом (это не изменяет исходное значение objArr):

const result = objArr.map(o => Object.keys(obj).includes(o.id.toString()) ? Object.assign(o, {value: obj[o.id]}) : o);
  • Object.keys(obj).includes(o.id.toString()): проверьте, является ли в obj запись сключ, соответствующий id в objArr (см. Object.keys )
  • Object.assign(o, {value: obj[o.id]}) : o): если это так, создайте новый объект со значением в objArr, нопереопределить value (см. Object.assign ).Если нет, вернуть тот же объект.

Демо:

const objArr = [
  {
    id: 6,
    // ...
    value: '2000'
    // ...
  },
  {
    id: 123,
    // ...
    value: '400'
    // ...
  },
  {
    id: 140,
    // ...
    value: ''
    // ...
  }
];

const obj = {
  '6': '1500',
  '123': '180',
  '140': ''
};

const result = objArr.map(o => Object.keys(obj).includes(o.id.toString()) ? Object.assign(o, {value: obj[o.id]}) : o);

console.log(result);
0 голосов
/ 08 октября 2018

Если у вас все в порядке с изменением исходного массива, это поможет:

Просто переберите исходный объект и проверьте, есть ли обновление

objArr.forEach(o=>{
    if( obj[o.id] )
        o.value = obj[o.id]
});

Пример:

var objArr = [
  {
    id: 6,
    name: 'Activity Attendance',
    type: 'Number',
    value: '2000',
    nameChanged: false,
    typeChanged: false,
    internalName: 'activity_attendance'
  },
  {
    id: 123,
    name: 'Total Number of Interacted Consumers',
    type: 'Number',
    value: '400',
    nameChanged: false,
    typeChanged: false,
    internalName: 'total_number_of_interacted_consumers'
  },
  {
    id: 140,
    name: 'Booth Location',
    type: 'Select (Single Answer)',
    value: '',
    nameChanged: false,
    typeChanged: false,
    internalName: 'booth_location'
  }
];

var obj = {
  '6': '1500',
  '123': '180',
  '140': ''
};

// loop through the array of objects
objArr.forEach(o=>{

    // see if there is an update in the `obj` var
    if( obj[o.id] )
        o.value = obj[o.id] // apply the update
});

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