2017-09-13 55 views
0

我需要合并两个JSON对象。合并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嵌套循环并没有为我工作得很好:(

谢谢

+0

你尝试https://stackoverflow.com/q/9134649/3365113 – TechGirl

+0

是的,但我不能使用jQuery我害怕。 – flaesh

回答

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);

+0

非常感谢,我终于用这个版本解决了我的问题! – flaesh

+0

不客气,我很高兴它帮助你:) – codtex

1

你可以拿一个哈希表来记住插入的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; }

+0

很好的答案!可悲的是,我只能接受一个“回答”,@codtex只是更快一点。非常感谢! – flaesh