2016-10-09 58 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