我知道有很多“在 JS 中合并两个对象数组”的问题,并且我已经阅读了其中的大部分。 与我想做的最相似的一些是:
How can I merge properties of two JavaScript objects dynamically?
Native javascript - merge two arrays of objects
How to merge two array of objects SQL style JOIN on JSON data
我的问题有所不同,因为我正在尝试执行完整的 SQL 连接,其中数组的大小不同,并且会有新列。
例如:
JSON1 = [{Color:"Blue", ID:"15", Size:"Large",Shape:"Square"},
{Color:"Red", ID:"9", Size:"Medium",Shape:"Circle"},
{Color:"Red", ID:"2", Size:"Large",Shape:"Triangle"},
{Color:"Yellow", ID:"3", Size:"Small",Shape:"Square"}];
JSON2 = [{Color:"Blue", Name:"Henry", Inches:"51"},
{Color:"Red", Name:"Jane", Inches:"7"},
{Color:"Pink", Name:"Jack", Inches:"14"}];
期望的输出:
OUTPUT =[{Color:"Blue", ID:"15", Size:"Large",Shape:"Square",Name:"Henry", Inches:"51"},
{Color:"Red", ID:"9", Size:"Medium",Shape:"Circle",Name:"Jane", Inches:"7"},
{Color:"Red", ID:"2", Size:"Large",Shape:"Triangle",Name:"Jane", Inches:"7"},
{Color:"Yellow", ID:"3", Size:"Small",Shape:"Square",Name:null, Inches:null},
{Color:"Pink", ID:null, Size:null,Shape:null,Name:"Jack", Inches:"14"}];
因此,与完整的 SQL 连接类似,我希望输出 JSON 包含所有列,当存在匹配时进行匹配,但如果第二个 JSON 中的键:值对与任何一个都不匹配,则显示一个新行第一个中的任何对象中的那些。
到目前为止我所拥有的如下。它通常可以工作,但有几个问题。我正在合并一个特定的预定义值,如果该函数能够找出匹配值在哪里,那就太好了。另外,如果我向 JSON2 添加多个新属性列,我的函数就会失败(即,如果 JSON2 有“颜色”和“英寸”,但没有“颜色”、“英寸”和“名称”,则该函数有效。)因为我只是将一个属性哈希到另一个属性。
var hash={};
for(var e in JSON2){
hash[JSON2[e]["Color"]]= JSON2[e]["Inches"];
}
var trackHash = hash;
for(var k in JSON1){
JSON1[k]["Inches"] = hash[JSON1[k]["Color"]];
if(hash[JSON1[k]["Color"]]===undefined){
delete trackHash[JSON1[k]["Color"]];
}
}
for(var obj in JSON2){
if(trackHash[JSON2[obj]["Color"]]!==undefined){
JSON1.push(JSON2[obj]);
}
}
最佳答案
我想这可能就是你所追求的,..
它可以进行优化等,但希望这是一个开始。
哦,为了简单起见,我还使用了 Object.assign,所以请注意,对于旧浏览器,您可能需要一个 polyfill,或者使用像 lodash 这样的东西。
var JSON1 = [{Color:"Blue", ID:"15", Size:"Large",Shape:"Square"},
{Color:"Red", ID:"9", Size:"Medium",Shape:"Circle"},
{Color:"Red", ID:"2", Size:"Large",Shape:"Triangle"},
{Color:"Yellow", ID:"3", Size:"Small",Shape:"Square"}];
var JSON2 = [{Color:"Blue", Name:"Henry", Inches:"51"},
{Color:"Red", Name:"Jane", Inches:"7"},
{Color:"Pink", Name:"Jack", Inches:"14"}];
function fullJoin(a, b) {
var r = [];
a.forEach(function (a) {
var found = false;
b.forEach(function (b) {
if (a.Color === b.Color) {
var j = Object.assign(a, b);
r.push(j);
found = true;
}
})
if (!found) r.push(a);
});
b.forEach(function (b) {
var found = false;
a.forEach(function (a) {
if (a.Color === b.Color) found = true;
});
if (!found) r.push(b);
});
return r;
}
var a = fullJoin(JSON1, JSON2);
a.forEach(function (a) { console.log(JSON.stringify(a)); });
关于javascript - 相当于 SQL 完全连接与 Javascript 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097679/