слияние дочернего объекта с родительским объектом в API

#javascript #node.js #angularjs #mongodb #mongoose

#javascript #node.js #angularjs #mongodb #мангуст

Вопрос:

Я должен объединить все данные в один объект. У меня есть массив объектов, каждый из которых имеет встроенный объект, например:

 [
  {
    robots: [],
    lines: [],
    _id: 5f753118391fe067dcfa1c88,
    shift: 'Shift A',
    date: 2020-10-01T00:00:00.000Z,
    rawData: {
      robot1_runTime: 4989,
      robot2_runTime: 6956,
      robot2_waitTime: 6944,
    },
    createdAt: 2020-10-01T01:30:00.918Z,
    updatedAt: 2020-10-01T02:47:22.107Z,
    __v: 0
  },
 {
    robots: [],
    lines: [],
    _id: 5f753118391fe067dcfa1c88,
    shift: 'Shift A',
    date: 2020-10-01T00:00:00.000Z,
    rawData: {
      robot1_runTime: 4989,
      robot2_runTime: 6956,
      robot2_waitTime: 6944,
    },
    createdAt: 2020-10-01T01:30:00.918Z,
    updatedAt: 2020-10-01T02:47:22.107Z,
    __v: 0
  }
]
  

И я должен объединить поля во встроенном объекте rawData с родительским объектом следующим образом:

 [
  {
    robots: [],
    lines: [],
    _id: 5f753118391fe067dcfa1c88,
    shift: 'Shift A',
    date: 2020-10-01T00:00:00.000Z,
    robot1_runTime: 4989,
    robot2_runTime: 6956,
    robot2_waitTime: 6944,
    createdAt: 2020-10-01T01:30:00.918Z,
    updatedAt: 2020-10-01T02:47:22.107Z,
    __v: 0
  },
 {
    robots: [],
    lines: [],
    _id: 5f753118391fe067dcfa1c88,
    shift: 'Shift A',
    date: 2020-10-01T00:00:00.000Z,
    robot1_runTime: 4989,
    robot2_runTime: 6956,
    robot2_waitTime: 6944,
    createdAt: 2020-10-01T01:30:00.918Z,
    updatedAt: 2020-10-01T02:47:22.107Z,
    __v: 0
  }
] 
  

Каждое поле во rawData внедренном объекте должно быть полем во внешнем объекте, полностью исключая внедренный объект.
Может кто-нибудь сказать мне, как я могу это реализовать, чтобы я мог передать API другой команде?

Ответ №1:

Вот пример того, как вы могли бы объединить это вложенное свойство с родительским объектом.

 let obj = {
    robots: [],
    lines: [],
    _id: '5f753118391fe067dcfa1c88',
    shift: 'Shift A',
    date: '2020-10-01T00:00:00.000Z',
    rawData: {
      robot1_runTime: 4989,
      robot2_runTime: 6956,
      robot2_waitTime: 6944,
      robot2_faultTime: 102,
      skuLine4B_name: '0',
      skuLine2_name: '32477045',
      skuLine1_count: '0',
      robot1_faultTime: 0,
      robot1_waitTime: 4926,
      dateReportingLastChange: '2020-09-30T23:14:51.400Z',
      last_connection: '2020-09-30T23:14:51.400Z',
      skuLine1_name: '0',
      skuLine1_value: 0,
      skuLine10_name: '0',
      skuLine10_value: 0,
      skuLine12_name: '32477213',
      skuLine12_value: 77,
      skuLine13_name: '32477063',
      skuLine13_value: 52,
      skuLine2_value: 249,
      skuLine3_name: '32476914',
      skuLine3_value: 1,
      skuLine4A_name: '0',
      skuLine4A_value: 0,
      skuLine5_name: '68190192',
      skuLine5_value: 6,
      skuLine9_name: '0',
      skuLine9_value: 0,
      skuLine4B_value: 0
    },
    createdAt: '2020-10-01T01:30:00.918Z',
    updatedAt: '2020-10-01T02:47:22.107Z',
    __v: 0
  }
  
  obj = {...obj, ...obj.rawData};
  delete obj.rawData;
  console.log(obj);  

Ответ №2:

Если вы делаете это в js, то вы могли бы сделать следующее (я предполагаю, что у вас есть массив таких объектов в dataArr переменной):

 const dataArr = [
  {
    robots: [],
    lines: [],
    _id: "5f753118391fe067dcfa1c88",
    shift: 'Shift A',
    date: "2020-10-01T00:00:00.000Z",
    rawData: {
      robot1_runTime: 4989,
      robot2_runTime: 6956,
      robot2_waitTime: 6944,
    },
    createdAt: "2020-10-01T01:30:00.918Z",
    updatedAt: "2020-10-01T02:47:22.107Z",
    __v: 0
  },
 {
    robots: [],
    lines: [],
    _id: "5f753118391fe067dcfa1c88",
    shift: 'Shift A',
    date: "2020-10-01T00:00:00.000Z",
    rawData: {
      robot1_runTime: 4989,
      robot2_runTime: 6956,
      robot2_waitTime: 6944,
    },
    createdAt: "2020-10-01T01:30:00.918Z",
    updatedAt: "2020-10-01T02:47:22.107Z",
    __v: 0
  }
]



dataArr.forEach(obj => {
    for(const key of Object.keys(obj.rawData)){
        obj[key] = obj.rawData[key];
    }
    delete obj.rawData;
})

console.log(dataArr);