2016-10-18 7 views
1

「JSにオブジェクトの2つの配列をマージする」という質問がたくさんありますが、それらのほとんどを読んでいます。私は何をしようとしていると、いくつかの最も類似 は以下のとおりです。Javascriptオブジェクトの配列を持つSQL完全結合に相当する

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はすべての列を含むようにしたいです、 2番目のJSONのkey:valueペアが最初のオブジェクトのいずれかのオブジェクトのいずれとも一致しない場合は、新しい行が追加されます。

ここまでは以下のとおりです。それは一般的に動作しますが、カップルの問題があります。私は特定の事前定義された値をマージしています。そして、関数がマッチング値がどこにあるのかを知ることはうれしいでしょう。また、JSON2に複数の新しいプロパティ列を追加すると、関数が失敗します(つまり、JSON2にColorとInchesがあり、Color、Inches、およびNameがない場合は機能します)。

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]); 
    } 
} 
+0

あなたの質問に* * * JSONが表示されています。あなたの入力と出力はどちらもオブジェクトの配列です。 – nnnnnn

+1

@ Acoustic77まだ答えがあなたの考えを待っている:) – kukkuz

+0

申し訳ありませんが、あなたの答えを見たが、友人は私が線形時間にそれを行うのを手伝うことができたので、私は答えを投稿しようとします – Acoustic77

答えて

0

私は、これはこれは、などの最適化を図ることができ、うまくいけば、これはスタートが何であるかをあなたの後..

かもしれないと思います。

わかりやすくするために、私はObject.assignも使用していますので、古いブラウザではポリフィルが必要かもしれないし、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)); });

0

は私が配列でやったことです:

  1. 使用Array.prototype.map対応する類似のためのキー/値の中にコピーしてJSON1から新しい配列を作成しますキーをJSON2

  2. JSON2JSON1には含まれていません。

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"}]; 
 

 

 
var excluded = {}; 
 

 
// Join JSON2 to JSON1 
 
// also track elements in JSON2 not in JSON1 
 
var result = JSON1.map(function(a) { 
 
     JSON2.forEach(function(element, index, array) { 
 
     if (a.Color === element.Color) { 
 
      Object.keys(element).forEach(function(key) { 
 
      a[key] = element[key]; 
 
      }); 
 
     } else { 
 
      this.visited = this.visited + 1 || 0; 
 
      if(this.visited == array.length) { 
 
       this.found = this.found || []; 
 
       this.found.push(element); 
 
      } 
 
     } 
 
     }, this); 
 
     this.visited = 0; 
 
     return a; 
 
     }, excluded); 
 

 
// add elements in JSON2 not in JSON1 
 
if(excluded.found) { 
 
    excluded.found.forEach(function(element) { 
 
     result.push(element); 
 
    }); 
 
} 
 

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

これがあなたのために働いていたなら、私はあなたのフィードバックを知ってみましょう。ありがとう!

+0

@Acoustic77これについてのあなたのご意見をお聞かせください。ありがとう! – kukkuz

関連する問題