JavaScript обновляет значение объекта из другого объекта - PullRequest
2 голосов
/ 27 марта 2019

У меня есть два объекта, один используется для обновления другого, что-то вроде процесса ETL.

const currentObject = {
    myObject : [
      {
        'attribute1':'foo1',
        'attribute2':'bar1',
        'attribute3':'test1'
      },
      {
        'attribute1':'foo2',
        'attribute2':'bar2',
        'attribute3':'test2'
      },
      {
       'attribute1':'foo3',
       'attribute2':'bar3',
       'attribute3':'test3'
      },
   ]
}

если значение attribute3 равно «test1», перейдите к другому объекту и проверьте наличие test1свойство и замените currentObject новым значением

const updateObject = {
  myObject : {
    'test1':'newtest1',
    'test2':'newtest2',
    'test3':'newtest3'
  }
}

обновление выполняется для атрибута currentObject; необходимо использовать свойство updateObject в качестве ссылки;где currentObject attribute1 = "test1" должен копировать данные из updateObject test1, поэтому:

Конечное значение должно быть следующим:

const currentObject = {
    myObject : [
      {
        'attribute1':'foo1',
        'attribute2':'bar1',
        'attribute3':'newtest1'
      },
      {
        'attribute1':'foo2',
        'attribute2':'bar2',
        'attribute3':'newtest2'
      },
      {
       'attribute1':'foo3',
       'attribute2':'bar3',
       'attribute3':'newtest3'
      }
   ]
}

Ответы [ 3 ]

1 голос
/ 27 марта 2019

Мы можем использовать Array.reduce и искать свойство текущего элемента (ele) attribute3 в updateObject.myObject.

Если оно присутствует, обновите его соответствующим значением из updateObject.myObjectостальное сохрани старое:

const currentObject = {myObject : [{'attribute1':'foo1','attribute2':'bar1','attribute3':'test1'},{'attribute1':'foo2','attribute2':'bar2','attribute3':'test2'},{'attribute1':'foo3','attribute2':'bar3','attribute3':'test3'},]};
const updateObject = {myObject : {'test1':'newtest1','test2':'newtest2','test3':'newtest3'}};

function transformObject(currentObject, updateObject){
    const out = currentObject.myObject.reduce((acc, ele) => {
       ele.attribute3 = updateObject.myObject[ele.attribute3] ?
                        updateObject.myObject[ele.attribute3] : 
                        ele.attribute3;
       return acc.concat(ele);
    }, []);
    finalObj = {[Object.keys(currentObject)[0]] : out };
    return finalObj;
}
console.log(transformObject(currentObject, updateObject));
1 голос
/ 27 марта 2019

Это превращается в однострочник с последними возможностями языка JavaScript:

const currentObject = {
  myObject: [
    {
      'attribute1': 'foo1',
      'attribute2': 'bar1',
      'attribute3': 'test1'
    },
    {
      'attribute1': 'foo2',
      'attribute2': 'bar2',
      'attribute3': 'test2'
    },
    {
      'attribute1': 'foo3',
      'attribute2': 'bar3',
      'attribute3': 'test3'
    },
  ]
}

const updateObject = {
  myObject: {
    'test1': 'newtest1',
    'test2': 'newtest2',
    'test3': 'newtest3'
  }
}

const result = { myObject: currentObject.myObject.map(o => ({ ...o, ...{ 'attribute3': updateObject.myObject[o.attribute3] } })) };

console.log(result);

... и вы также получите неизменность.

1 голос
/ 27 марта 2019

Вы можете использовать forEach и Object.entries

Здесь идея

  • Первый цикл по каждому элементу в myObject массиве currentObject
  • Теперь, как и в вашей структуре, у вас есть значение currentObject как key в updateObject, поэтому мы проверяем существование по updateObject.myObject[value]
  • Если это их, мы обновляем currentObject иначе мы оставляем это без изменений

const currentObject = {myObject : [{'attribute1':'foo1','attribute2':'bar1','attribute3':'test1'},{'attribute1':'foo2','attribute2':'bar2','attribute3':'test2'},{'attribute1':'foo3','attribute2':'bar3','attribute3':'test3'},]}
const updateObject = {myObject : {'test1':'newtest1','test2':'newtest2','test3':'newtest3'}}

currentObject.myObject.forEach(e => {

Object.entries(e).forEach(([key,value]) => {
    if(updateObject.myObject[value]){
      e[key] = updateObject.myObject[value]
    }
  })
})

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