2016-10-09 10 views
5

mam ten javascript obiektów:Scalanie tablicy nowych obiektów do istniejącego obiektu js

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

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

Jak mogę połączyć lub dodać newArr do powiązanej CountryArray.

Oczekiwany wynik:

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

który wydaje niepotrzebnie trudne i nie konstruktywne. To nie jest proste pytanie - nie mogłem znaleźć prostej odpowiedzi po nieco dłuższym wyszukiwaniu - i nie należy zakładać, że nie podjęto żadnej próby. Najwyraźniej jest nowa na stronie i jest początkująca - zamiast potencjalnie alienować ją, może mógłbyś wyjaśnić, co mogłaby zrobić inaczej w przyszłości, na przykład dzieląc się tym, co już wypróbowała? –

+0

Dziękuję za komentarze, ale nigdy nie myśl, że nie próbowałem niczego. Wiele próbowałem, w tym concat, push i więcej. Wyszukaj dowolny wpis, który pomoże, ale nie udało mi się rozwiązać problemu. Dlatego pytam na tym forum. A mając taki scenariusz, jak w moim pytaniu, nie oznacza to, że muszę dużo robić? Przy okazji, wszyscy jesteście mili. – Yusnee

Odpowiedz

1

Jeśli chcesz połączyć, czasem trzeba splatać również. Wypróbuj to:

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

Do scalania z przychodzącymi nowymi danymi;

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

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

Aby splajtować dane przychodzące;

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

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

i powiązana funkcja;

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

    } 

nadzieję pomogą

+0

wielkie uznanie dla twojego wysiłku. Ale mam już na to moje rozwiązanie. Zasadniczo to samo. – Yusnee

5

concat?

countryArray = countryArray.concat(newArr); 

EDIT Ok, widzę, chcesz zaktualizować stany countryArray zgodnie z tym co jest w newArr, nie więcej concat:

EDIT2 concat jak chcesz dodać stany countryArray zgodnie z tym co jest w 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

konkluduj, ponieważ Twoja sugestia nie łączy go, ale utwórz nową tablicę :( – Yusnee

+0

Ok @Yusnee, zobacz moje Edycja :) –

+0

@ London Smith. Dziękuję za twój wysiłek, aby mi pomóc. Ale z konsolą.tabeli (countryArray), straciłem Penanga i Johora. Oznacza to, że zastępuje się, a nie je łączy. – Yusnee

5

Zasadniczo chcesz odmianę JavaScript merging objects by id która łączy t on wartości tablic.

  1. Utwórz tabelę skrótów.
  2. Powoduje iterację obu tablic i przechowywanie danych w tabeli skrótów indeksowanych przez identyfikator. Jeśli istnieją już dane z tym identyfikatorem, połącz je.
  3. Uzyskaj tablicę z wartościami mapy skrótów.

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 God blesh you. Dziękuję wszystkim, którzy stracili dla mnie czas. W moim kraju nie ma 8:25. Nie spałem całą noc szukając pomocy. – Yusnee

Powiązane problemy