【问题标题】:Merging JSON objects with value comparison使用值比较合并 JSON 对象
【发布时间】:2017-09-13 15:43:08
【问题描述】:

我需要合并两个 JSON 对象。

第一个对象:

var objectA = {
  "UUID1": {
    "user": {
      "ID": "1"
    }
  },
  "UUID2": {
    "user": {
      "ID": "2"
    }
  },
  "UUID3": {
    "user": {
      "ID": "3"
    }
  }
}

第二个对象:

var objectB = {
  "UUID4": {
    "user": {
      "ID": "4"
    }
  },
  "UUID5": {
    "user": {
      "ID": "3"
    }
  },
  "UUID6": {
    "user": {
      "ID": "2"
    }
  }
}

预期结果:

{
  "UUID1": {
    "user": {
      "ID": "1"
    }
  },
  "UUID2": {
    "user": {
      "ID": "2"
    }
  },
  "UUID3": {
    "user": {
      "ID": "3"
    }
  },
  "UUID4": {
    "user": {
      "ID": "4"
    }
  }
}

诀窍是,UUID 会有所不同,但主键是用户 ID。所以,我需要比较用户 ID,只保留一个 UUID。

有没有聪明的方法来解决这个问题?使用Object.keys(objectX).forEach 的嵌套循环对我来说效果不佳:(

谢谢!

【问题讨论】:

标签: javascript json node.js


【解决方案1】:

您可以创建自定义函数来为您处理此问题。像这样的:

var objectA = {
  "UUID1": {"user": {"ID": "1"}},
  "UUID2": {"user": {"ID": "2"}},
  "UUID3": {"user": {"ID": "3"}}
}

var objectB = {
  "UUID4": {"user": {"ID": "4"}},
  "UUID5": {"user": {"ID": "3"}},
  "UUID6": {"user": {"ID": "2"}}
}

function merge() {
  var result = {};
  var ids = [];
  for (var i = 0; i < arguments.length; i++) {
    for (var uuid in arguments[i]) {
      if (~ids.indexOf(arguments[i][uuid].user.ID)) {
        continue;
      }
      result[uuid] = arguments[i][uuid];
      ids.push(arguments[i][uuid].user.ID);
    }
  }
  return result;
}

var merged = merge(objectA, objectB);
console.log(merged);

【讨论】:

  • 非常感谢,终于用这个版本解决了我的问题!
【解决方案2】:

您可以使用一个哈希表来记住插入的ID,并根据给定的对象构建一个新对象。

var objectA = { UUID1: { user: { ID: "1" } }, UUID2: { user: { ID: "2" } }, UUID3: { user: { ID: "3" } } },
    objectB = { UUID4: { user: { ID: "4" } }, UUID5: { user: { ID: "3" } }, UUID6: { user: { ID: "2" } } },
    hash = Object.create(null),
    result = [objectA, objectB].reduce(function (r, o) {
        Object.keys(o).forEach(function (k) {
            if (!hash[o[k].user.ID]) {
                hash[o[k].user.ID] = true;
                r[k] = o[k];
            }
        });
        return r;
    }, {});

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

【讨论】:

  • 答案也很好!可悲的是,我只能接受一个“已回答”,而@codtex 对他的反应要快一些。非常感谢!
猜你喜欢
  • 2015-01-05
  • 2023-02-08
  • 2022-11-28
  • 2015-04-02
  • 1970-01-01
  • 2021-09-19
  • 2021-12-24
  • 2018-11-20
  • 2016-05-07
相关资源
最近更新 更多