最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How to merge two json object values by id with plain Javascript (ES6) - Stack Overflow

programmeradmin2浏览0评论

I have two arrays of Javascript Objects and want to merge the properties of the two Javascript Objects with identical "ObjID" into one Javascript Object.

For example:

// Array of Javascript Objects 1:
let request1 = [{"ObjId":174864,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":142},
{"ObjId":175999,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":149}]

// Array of Javascript Objects 2:
let request2 = [{"ObjId":174864,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-034-1","MulExtentS":"jpg"},
{"ObjId":177791,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-035-1","MulExtentS":"jpg"}]

Merge into one Javascript object with the values of the same ObjId (see ObjID: 174864) and the rest (of the Objects) stays untouched:

let result = [{"ObjId":174864,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":142,
"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-034-1","MulExtentS":"jpg"},
{"ObjId":175999,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":149},
{"ObjId":177791,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-035-1","MulExtentS":"jpg"}]

What I tried so far:

let request1 = [{"ObjId":174864,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":142},
{"ObjId":175999,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":149}]

let request2 = [{"ObjId":174864,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-034-1","MulExtentS":"jpg"},
{"ObjId":177791,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-035-1","MulExtentS":"jpg"}]

function joinObjects() {
  var idMap = {};
  for(let i = 0; i < arguments.length; i++) {
    for(let j = 0; j < arguments[i].length; j++) {
       let currentID = arguments[i][j]['ObjId'];
       if(!idMap[currentID]) {
          idMap[currentID] = {};
        }
       // Iterate over properties of objects in arrays
      for(key in arguments[i][j]) {
          idMap[currentID][key] = arguments[i][j][key];
      }
    }
  }

  // push properties of idMap into an array
  let newArray = [];
  for(property in idMap) {
    newArray.push(idMap[property]);
  }
  return newArray;
}

let result = joinObjects(request1, request2);

I have two arrays of Javascript Objects and want to merge the properties of the two Javascript Objects with identical "ObjID" into one Javascript Object.

For example:

// Array of Javascript Objects 1:
let request1 = [{"ObjId":174864,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":142},
{"ObjId":175999,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":149}]

// Array of Javascript Objects 2:
let request2 = [{"ObjId":174864,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-034-1","MulExtentS":"jpg"},
{"ObjId":177791,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-035-1","MulExtentS":"jpg"}]

Merge into one Javascript object with the values of the same ObjId (see ObjID: 174864) and the rest (of the Objects) stays untouched:

let result = [{"ObjId":174864,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":142,
"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-034-1","MulExtentS":"jpg"},
{"ObjId":175999,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":149},
{"ObjId":177791,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-035-1","MulExtentS":"jpg"}]

What I tried so far:

let request1 = [{"ObjId":174864,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":142},
{"ObjId":175999,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":149}]

let request2 = [{"ObjId":174864,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-034-1","MulExtentS":"jpg"},
{"ObjId":177791,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-035-1","MulExtentS":"jpg"}]

function joinObjects() {
  var idMap = {};
  for(let i = 0; i < arguments.length; i++) {
    for(let j = 0; j < arguments[i].length; j++) {
       let currentID = arguments[i][j]['ObjId'];
       if(!idMap[currentID]) {
          idMap[currentID] = {};
        }
       // Iterate over properties of objects in arrays
      for(key in arguments[i][j]) {
          idMap[currentID][key] = arguments[i][j][key];
      }
    }
  }

  // push properties of idMap into an array
  let newArray = [];
  for(property in idMap) {
    newArray.push(idMap[property]);
  }
  return newArray;
}

let result = joinObjects(request1, request2);
Share Improve this question edited Feb 13, 2017 at 14:36 StandardNerd asked Feb 13, 2017 at 14:14 StandardNerdStandardNerd 4,18310 gold badges49 silver badges79 bronze badges 0
Add a ment  | 

4 Answers 4

Reset to default 5

You could use Map and Object.assign for merging the objects.

var request1 = [{
    ObjId: 174864,
    ObjMutationD: "2010-07-09T00:00:00.000Z",
    ObjMitarbeiterS: "epf",
    ObjAufId: 142
  }, {
    ObjId: 175999,
    ObjMutationD: "2010-07-09T00:00:00.000Z",
    ObjMitarbeiterS: "epf",
    ObjAufId: 149
  }],
  request2 = [{
    ObjId: 174864,
    MulPfadS: "M:\\Originalbilder\\FGS\\95nn",
    MulDateiS: "9576.305-034-1",
    MulExtentS: "jpg"
  }, {
    ObjId: 177791,
    MulPfadS: "M:\\Originalbilder\\FGS\\95nn",
    MulDateiS: "9576.305-035-1",
    MulExtentS: "jpg"
  }];

var result = [...[request1, request2].reduce((m, a) => (a.forEach(o => m.has(o.ObjId) && Object.assign(m.get(o.ObjId), o) || m.set(o.ObjId, o)), m), new Map).values()];

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

You can achieve this using Lodash _.merge function.

// Array of Javascript Objects 1:
let request1 = [{"ObjId":174864,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":142},
{"ObjId":175999,"ObjMutationD":"2010-07-09T00:00:00.000Z","ObjMitarbeiterS":"epf","ObjAufId":149}]

// Array of Javascript Objects 2:
let request2 = [{"ObjId":174864,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-034-1","MulExtentS":"jpg"},
{"ObjId":177791,"MulPfadS":"M:\\Originalbilder\\FGS\\95nn","MulDateiS":"9576.305-035-1","MulExtentS":"jpg"}]

var merged = _.merge(_.keyBy(request1, 'ObjId'), _.keyBy(request2, 'ObjId'));
var result = _.values(merged);
console.log(result);
<script src="https://cdn.jsdelivr/npm/[email protected]/lodash.min.js"></script>

in ES6 the spread operator will do that for you

 var merged = {...request1[0], ...request2[0]};

More info here: https://davidwalsh.name/merge-objects

You can do like this.

var merged = request1.map((x,i) => {
return {... request1[i],... request2[i]}
})
发布评论

评论列表(0)

  1. 暂无评论