将JSON对象与值比较合并

时间:2017-09-13 15:43:08

标签: javascript json node.js

我需要合并两个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的嵌套循环对我来说不起作用:(

谢谢!

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您可以使用哈希表来记住插入的ID并从给定对象中构建新对象。

&#13;
&#13;
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;