javascript - 相当于 SQL 完全连接与 Javascript 对象数组

标签 javascript arrays json

我知道有很多“在 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/

相关文章:

javascript - javascript 有没有办法知道指定时区的上午 9 点是什么时间?

javascript - requirejs 中的 Handlebars 加载不成功

c - 需要解释 - 3-D 数组、指针

c# - 这段代码中的 IEventRepository 是什么? Resolver.resolve( ) 是做什么的?

javascript - NEDB 查询在数组上使用 $nin 返回误报

javascript - 通过 json 和 ajax 将事件从 Controller 获取到完整日历

javascript - 为什么我的 Auth0 在 React 中找不到我的回调路由?

javascript - 单击后函数运行两次

python - 如何在Python中计算两个二维数组之间的互元素?

c - 如何从文件中获取字符串并存储在二维字符数组中,并将该二维字符数组与 C 中的字符串进行比较?