Poniżej znajdują się moje dwie tablice. Chcę je porównać, a wynikowa tablica powinna zawierać zaktualizowane wartości. Są one wspólne .. Tablice obejmują n poziomach, tj., że nie ma stałego poziomu ..Porównaj dwie tablice i zaktualizuj nowe wartości, zachowując istniejące obiekty przy użyciu javascript
pierwsza tablica tzn. matryca przed updation ..
var parentArray1=[
{
"id": 1,
"name": "test",
"context": [
{
"id": 1.1,
"name": "test 1.1"
}
]
},
{
"id": 2,
"name": "test"
},
{
"id": 3,
"name": "test",
"context": [
{
"id": 3.1,
"name": "test 3.1"
}
]
},
{
"id": 4,
"name": "test"
}
]
że operacje wykonywane są
1.Adding nowy Pozycja 2.Upda ting istniejący element
W wyniku tych dwóch operacji zmienione wartości I będzie coraz w innej tablicy .. tzn.
var changedArray=
[
{
"id": 1,
"name": "test1",
"context": [
{
"id": 1.1,
"name": "Changed test 1.1"
}
]
},
{
"id": 5,
"name": "test5"
}
]
Teraz Pisałem rodzajowe funkcji, które przechodzi poprzez parentArray1 i stosując unikalne propertiesI trzeba dodać nowy element, jeśli element jest tam w changedArray lub zaktualizować istniejący element na każdym poziomie
Uzyskana tablica powinna być ..
[
{
"id": 1,
"name": "test",
"context": [
{
"id": 1.1,
"name": "Changed test 1.1"
}
]
},
{
"id": 2,
"name": "test"
},
{
"id": 3,
"name": "test",
"context": [
{
"id": 3.1,
"name": "test 3.1"
}
]
},
{
"id": 4,
"name": "test"
},
{
"id": 5,
"name": "test5"
}
]
Generic funkcja:
compareArray(parentArray1, changedArray, ["id"]);
function compareArray(array1, array2, propertyArray) {
var newItem = new Array();
array2.map(function(a1Item) {
array1.map(function(a2Item) {
/If array loop again/
if (a2Item.constructor === Array) {
compareArray(a2Item, a1Item)
} else {
/loop the property name to validate/
propertyArray.map(function(property) {
if (a2Item[property]) {
if (a2Item[property] === a1Item[property]) {
a2Item = a1Item
} else {
var isAvailable = _.find(newItem, function(item) {
return item[property] === a1Item[property]
})
if (!isAvailable) {
newItem.push(a1Item);
}
}
}
})
}
});
});
/Insert the new item into the source array/
newItem.map(function(item) {
array1.push(item);
});
console.log("After Compare : " + array1);
}
Kod, który udostępniasz, ma dodatkową funkcjonalność, jeśli element tablicy jest także tablicą. Czy chcesz to zachować? Załóżmy również, że masz coś takiego jak '{a: {b: 'value'}}' jako element w array2.Jeśli chcesz zaktualizować wartość a w oryginalnym obiekcie, czy chcesz go zaktualizować za pomocą '=', co oznacza, że aktualizujesz jedynie odniesienia do obiektu, czy też chcesz sklonować wartość '{b: ' } 'obiekt i mieć inną instancję o tych samych wartościach? –
W moim przypadku tablica jest zagnieżdżona z innymi właściwościami i jeśli wartością jest obiekt, powinniśmy sklonować. Jedynym identyfikatorem w tablicy jest nazwa właściwości tj.., Id's – forgottofly
Myślę, że twoje pytanie jest zbyt skomplikowane, nie możesz dokładnie określić problem, który masz? Co nie działa tak, jak myślisz, powinno? – froginvasion