如何在JavaScript中合并具有相同键的对象?

4
我有一个名为commondata的数组。
commondata = [{
   giverUser: 'Abc',
   createdAt: '2016 11: 48: 40',
   note: 'Test'
 }, {
   giverUser: 'Xyz',
   createdAt: '12: 22: 37',
   note: 'Test data'
 }, {
   giverUser: 'Abc',
   createdAt: '2016 14: 22: 07',
   note: '"test123"'
 }];

当我试图使用以下代码合并上面的对象数组时,我得到的仍是原来的数组。
以下是我的代码:
commondata.forEach(function(a, i) {

  if (!this[a.giverUser]) {

    this[a.giveruser] = {
      giverUser: a.giverUser,
      createdAt: [],
      note: []
    };
    r_grouped.push(this[a.giveruser]);
  }

  this[a.giveruser].createdAt = this[a.giveruser].createdAt.concat(a.createdAt);
  this[a.giveruser].note = this[a.giveruser].note.concat(a.note);
}, Object.create(null));

上述代码有什么问题? 为什么我没有得到相同 giveruser 的合并数组?

你可以使用 reduceObject.assign - evolutionxbox
你的答案已经在这里了。https://dev59.com/MHVC5IYBdhLWcg3w1E1q - 0xdw
上面的代码有什么问题吗? - Akki
@DININDU:我的代码只有一个对象数组,而不是两个不同的对象,请仔细查看! - Akki
@Akki https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign - 0xdw
1个回答

6

您在giveruser中有一些拼写错误,应该改为giverUser

其余部分工作正常

var commondata = [{ giverUser: 'Abc', createdAt: '2016 11:48:40', note: 'Test' }, { giverUser: 'Xyz', createdAt: '12:22:37', note: 'Test data' }, { giverUser: 'Abc', createdAt: '2016 14:22:07', note: '"test123"' }],
    r_grouped = [];

commondata.forEach(function (a, i) {
    if (!this[a.giverUser]) {
        this[a.giverUser] = { giverUser: a.giverUser, createdAt: [], note: [] };

        r_grouped.push(this[a.giverUser]);
    }
    this[a.giverUser].createdAt.push(a.createdAt);
    this[a.giverUser].note.push(a.note);
}, Object.create(null));

document.write('<pre>' + JSON.stringify(r_grouped, 0, 4) + '</pre>');

只是另一个注释

this[a.giverUser].createdAt = this[a.giverUser].createdAt.concat(a.createdAt);

如果值不是数组,这并不是必需的。您可以使用 push。

this[a.giverUser].createdAt.push(a.createdAt);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接