2016-10-09 9 views
5

に新しい配列オブジェクトをマージします。は、私はこのJavaScriptのオブジェクトを持っている既存のオブジェクトのjs

期待される結果:

var countryArray = [{ 
"country" : 'Indonesia', 
"state" : ['DKI','Bali'], 
}, 
{ 
"country" : 'Malaysia', 
"state" : ['Penang','Johor','Kelantan'], 
}]; 
+2

をするのに役立ちます。これはまったく簡単な質問ではありません。私はちょっと調べてから簡単な答えを見つけることができませんでした。試行されていないと仮定するのは公正ではありません。明らかに彼女はサイトの初心者であり、潜在的に彼女を疎外させるのではなく、自分がすでに試したことを分かち合うなど、将来的に何ができるかを説明できるかもしれません。 –

+0

コメントありがとうございますが、私は何も試していないと思うことはありません。私は、コンカット、プッシュなどを含めてたくさん試しました。助けになる投稿を検索してください。しかし、私は問題を解決できませんでした。だから私はこのフォーラムで尋ねています。そして、私の質問のようにそのスクリプトを持つことによって、私はたくさんのことをしなければならないということを意味しないのですか?ところで、あなたはすてきです。 – Yusnee

答えて

1

マージする場合は、時にはあなたは、同様にスプライスする必要があります。これを試してください:

var countryArray = [{ 
    "country" : "Indonesia", 
    "state" : ["DKI","Bali"], 
    }, 
    { 
    "country" : "Malaysia", 
    "state" : ["Penang","Johor"], 
    }]; 

受信した新しいデータと結合するには:

var newArr = [{ "country" : "Malaysia", "state" : ["Kelantan"] }]; 

MergeArray(countryArray,newArr); 
console.table(countryArray); 

受信データをスプライスするには。

var DelArray = [{ "country" : "Malaysia", "state" : ["Penang"] }]; 

SpliceArray(countryArray,DelArray); 
console.table(countryArray); 

および関連する機能;

function MergeArray(countryArray,newArr) { 
var a = 0; 
    $.each(newArr, function (key, data1) { 
    var b = 0; 
    $.each(countryArray, function (key, data2) { 

     if(data1.country == data2.country) { // match the same country 

    countryArray[b]["state"] = countryArray[b]["state"].concat(newArr[a]["state"]); 

     } 

    b++; }); 
    a++; }); 
} 

function SpliceArray(countryArray,DelArray) { 
    var a=0; 
      $.each(DelArray, function (key, data1) { 
       var b=0; 
       $.each(countryArray, function (key, data2) { 

         if(data1.country == data2.country) { // get same country  

         console.log(countryArray[b]["state"]) // ["Penang", "Johor", "Kelantan"] 

          for(var c=0; c < countryArray[b]["state"].length; c++){ // loop in countryArray state[] 

          console.log(DelArray[a]['state']); // to remove : ["Penang"] 

           if(countryArray[b]["state"][c] == DelArray[a]['state']) { 

           countryArray[b]["state"].splice(c,1); // remove ["Penang"] 

           } 
          } 
         } 
       b++; 
       }); 
     a++; 
     }); 

    } 

希望が不必要に厳しいと建設的ではないようだ

+0

あなたの努力に感謝します。しかし私はすでに私の解決策を持っています。基本的に同じです。 – Yusnee

5

連結? [OK]を

countryArray = countryArray.concat(newArr); 

EDIT 、私が見る、あなたは、newArrにあるものに応じてこれ以上の連結countryArrayの状態を更新する:あなたがの状態を追加したいと

EDIT2 連結をcountryArray newArr

var countryArray = [{ 
    "country" : "Indonesia", 
    "state" : ["DKI","Bali"], 
    }, 
    { 
    "country" : "Malaysia", 
    "state" : ["Penang","Johor"], 
    }]; 

    var newArr = [{ "country" : "Malaysia", "state" : ["Kelantan"] }]; 

    alert("Before while: " + countryArray[1]["state"]); 
    var i=0; 
    while(countryArray[i]) { 
     var j=0; 
     while(newArr[j]) { 
     if(countryArray[i]["country"] == newArr[j]["country"]) { 
      countryArray[i]["state"] = countryArray[i]["state"].concat(newArr[j]["state"]); 
     } 
     j++; 
     } 
     i++; 
    } 
    alert("After while: " + countryArray[1]["state"]); 
+0

連結あなたの提案がそれをマージしますが、新しい配列:( – Yusnee

+0

[OK]を@Yusneeをしないように、私の編集:)ロンドン・スミス@ –

+0

を参照してください。私の助けに感謝します。しかしコンソールで。テーブル(countryArray)、私はペナンとジョホールを失った。それは、それらをマージするのではなく、置き換えることを意味します。 – Yusnee

5

にあるものに応じて基本的にあなたがトンをマージJavaScript merging objects by idのバリエーションが欲しいです彼は値を配列する。

  1. ハッシュテーブルを作成します。
  2. 反復両方の配列およびIDによってインデックスさハッシュテーブルにデータを格納します。そのIDを持つデータがすでにある場合は、それをマージします。
  3. ハッシュマップの値を持つ配列を取得します。

var countryArray = [{ 
 
    "country" : 'Indonesia', 
 
    "state" : ['DKI','Bali'], 
 
}, { 
 
    "country" : 'Malaysia', 
 
    "state" : ['Penang','Johor'], 
 
}]; 
 
var newArr = [{ 
 
    "country" : 'Malaysia', 
 
    "state" : ['Kelantan'] 
 
}]; 
 
function mergeById(objs, id) { 
 
    var hash = new Map(); 
 
    objs.forEach(function(obj) { 
 
    var merged = hash.get(obj[id]) || {}; 
 
    Object.keys(obj).forEach(function(key) { 
 
     if (key === id) return merged[id] = obj[id]; 
 
     if (!merged[key]) merged[key] = []; 
 
     if (Array.isArray(obj[key])) [].push.apply(merged[key], obj[key]); 
 
     else merged[key].push(obj[key]); 
 
    }) 
 
    hash.set(obj[id], merged) 
 
    }); 
 
    return Array.from(hash.values()); 
 
} 
 
console.log(mergeById(countryArray.concat(newArr), "country"));

+0

@オリオール神の肌肉あなた。私のために時間を無駄にした皆さん、ありがとう。私は私の国で午前8時25分です。私は夜中寝ずに助けを求めている。 – Yusnee

関連する問題