2016-10-09 92 views
5

我有這樣的JavaScript對象:合併新的數組對象,以現有的對象JS

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

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

如何合併或添加newArr到相關CountryArray。

預期結果:

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

這似乎是不必要的苛刻,而不是建設性的。這並不是一個簡單的問題 - 在四處搜尋後我找不到一個簡單的答案 - 並且假定沒有做出任何嘗試是不公平的。很明顯,她是該網站的新手,並且是初學者 - 而不是疏遠她,也許你可以解釋她未來可以做些什麼不同,比如分享她已經嘗試過的東西? –

+0

感謝您的評論,但千萬不要以爲我沒有嘗試過任何東西。我嘗試了很多,包括concat,push等等。搜索任何有幫助的帖子,但我無法解決問題。這就是爲什麼我在這個論壇上問。通過在我的問題中使用該腳本,這並不意味着我必須做很多事情?順便說一句,你都很好。 – 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

CONCAT?

countryArray = countryArray.concat(newArr); 

編輯 好吧,我明白了,你要根據是什麼newArr,沒有更多的CONCAT更新countryArray的狀態:

EDIT2 CONCAT作爲要添加的狀態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

concat作爲你的建議不合並它,但使新的陣列:( – Yusnee

+0

好吧@Yynee,看到我的編輯:) –

+0

@倫敦史密斯。感謝您的努力來幫助我。但與控制檯。表(countryarray),我失去了檳城和柔佛州。這意味着它只是取代,而不是合併它們。 – Yusnee

5

基本上你想要的合併的T 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

@ Oriol上帝保佑你。感謝所有爲我浪費時間的人。我在我的國家8:25 AM。我整夜都沒有睡覺尋求幫助。 – Yusnee