2016-08-04 27 views
1

Ich habe zwei Arrays wie folgt aus:Schnittpunkt zweier Array von Objekten Basis auf dem Wert

  1. [{ ID: 123, RefNo: "q1w2e3" transactionName: "Poke" }, { -ID: 143, REFNO: "w3e4r5", transactionName: "mon" }]

  2. [ { -ID: 456, REFNO: "q1w2e3", Bewertung: 5 }, { -ID: 967, REFNO: "w3e4r5", Bewertung: 3.5 } ]

Ich möchte, dass sie Grundlage verschmelzen auf die RefNr. Das resultierende Array würde folgendermaßen aussehen:

[ 
    { 
    id: 456, 
    refNo: "q1w2e3", 
    transactionName: "poke", 
    rating: 5 
    }, 
    { 
    id: 967, 
    refNo: "w3e4r5", 
    transactionName: "mon", 
    rating: 3.5 
    } 
] 

Es wird eine Eins-zu-eins-Zuordnung sein. In beiden Arrays ist keine doppelte refNo vorhanden.

+0

Sind nicht die 'id' Eigenschaften hier kollidieren?Welche möchten Sie im zusammengeführten Objekt behalten? – DDan

+0

Was ist der Algorithmus zum Zusammenführen, wenn beide Objekte, die Sie zusammenführen, widersprüchliche Eigenschaften haben? Zum Beispiel, wie hast du 'id: 456' anstelle von' id: 123' gewählt? – jfriend00

+0

Array 1 wird in Array 2 zusammengeführt, wobei die ID von Array 2 unverändert beibehalten wird und die ID von Array 1 entfernt wird. – nirvair

Antwort

2

können Sie gehen mit so etwas wie:

var arrayA = [{ id: 123, refNo: "q1w2e3", transactionName: "poke" }, { id: 143, refNo: "w3e4r5", transactionName: "mon" }]; 
var arrayB = [ { id: 456, refNo: "q1w2e3", rating: 5 }, { id: 967, refNo: "w3e4r5", rating: 3.5 } ]; 

var result = arrayA.map(function(itemA){ 
    var itemB = _.find(arrayB, function(x){ 
     return itemA.refNo === x.refNo; 
    }); 

    return _.merge(itemA, itemB); 
}); 

** Angenommener, dass, wenn dieselben Eigenschaften in beiden Positionen vorhanden - das Element aus der zweiten Reihe in merge gewinnen. Zusammenführung ist von lodash. lodash#merge

+0

Es gibt ein Problem hier. Das Ergebnis, das ich bekomme, ist itemB und nicht das kombinierte Array. – nirvair

+0

Nein, es ist tatsächlich itemA erweitert von itemB –

+0

versucht, dass. Dann bekomme ich itemA als Ergebnis. – nirvair

0

Dies könnte Ihnen helfen.

var array1 = [{ id: 123, refNo: "q1w2e3", transactionName: "poke" }, { id: 143, refNo: "w3e4r5", transactionName: "mon" }]; 
 

 
var array2 = [ { id: 456, refNo: "q1w2e3", rating: 5 }, { id: 967, refNo: "w3e4r5", rating: 3.5 } ]; 
 

 

 
for(var i = 0 ; i < array1.length ; i++) { 
 
\t var tempRef = array1[i]['refNo']; 
 
    
 
    for(var j = 0 ; j < array2.length ; j ++) { 
 
    \t if(array2[j]['refNo'] === tempRef) { 
 
    \t array1[i]['rating'] = array2[j]['rating']; 
 
    } 
 
    } 
 
} 
 

 
console.log(JSON.stringify(array1));

2

Tun Sie es mit Object.assign, Array#map und Array#find Methoden

var arr1 = [{ 
 
    id: 123, 
 
    refNo: "q1w2e3", 
 
    transactionName: "poke" 
 
}, { 
 
    id: 143, 
 
    refNo: "w3e4r5", 
 
    transactionName: "mon" 
 
}]; 
 
arr2 = [{ 
 
    id: 456, 
 
    refNo: "q1w2e3", 
 
    rating: 5 
 
}, { 
 
    id: 967, 
 
    refNo: "w3e4r5", 
 
    rating: 3.5 
 
}]; 
 

 
var arr3 = arr2 
 
    // iterate over `arr2` and generate array 
 
    // based on the it's element 
 
    .map(function(v) { 
 
    // create a new object and assign properties of both 
 
    // array object with same `refNo` property 
 
    return Object.assign({}, 
 
     // find the object with same `refNo` property 
 
     arr1.find(function(v1) { 
 
     // set the condition for find 
 
     return v1.refNo === v.refNo; 
 
     // set `v` for extending object property 
 
     }), v) 
 
    }) 
 

 
console.log(arr3);

+0

mit lodash Arbeit erhalte ich Daten in dieser Form' [ { "$ __": { "StrictMode": false, "Getter": {} , "wasPopulated": false, "activePaths": { "Pfade": {' Was genau ist das? – nirvair

+0

@phantomphoenix: welcher Browser? –

+0

Ich bekomme Daten vom Mungo-Modell. – nirvair

1

Dies könnte helfen. Einige Kommentare hinzugefügt, um die Schritte zu erklären.

var arr1 = [{ id: 123, refNo: "q1w2e3", transactionName: "poke" }, { id: 143, refNo: "w3e4r5", transactionName: "mon" }]; 
 
var arr2 = [ { id: 456, refNo: "q1w2e3", rating: 5 }, { id: 967, refNo: "w3e4r5", rating: 3.5 } ]; 
 
var resultArray = []; 
 

 
for (var i = 0, len = arr2.length; i < len; i++) { 
 
    // find in other array by 'refNo' 
 
    var findByRef = arr1.filter(function(v) { 
 
    return v.refNo === arr2[i].refNo; // Filter out the appropriate one 
 
    }); 
 

 
    // merge result 
 
    var merged = merge_options(findByRef[0], arr2[i]); 
 
    // add merged to result array 
 
    resultArray.push(merged); 
 
} 
 
// dump result array 
 
console.log(resultArray); 
 

 
// merge all attrs of two objects 
 
function merge_options(obj1,obj2){ 
 
    var obj3 = {}; 
 
    for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; } 
 
    for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; } 
 
    return obj3; 
 
}

0

die Zeit Schleife über alle Elemente von O (n^2) bis O (N) erforderlich, um zu reduzieren, kann man ein Objekt, dessen Schlüssel refNo s verwenden.

Etwas wie folgt aus:

var uniqueRefNos = {}; 

var array1 = [ { id: 123, refNo: "q1w2e3", transactionName: "poke" }, { id: 143, refNo: "w3e4r5", transactionName: "mon" } ]; 
var array2 = [ { id: 456, refNo: "q1w2e3", rating: 5 }, { id: 967, refNo: "w3e4r5", rating: 3.5 } ]; 

for(var i = 0 ; i < array1.length ; i++){ 
    //add all objects in array1 to uniqueRefNos 
    uniqueRefNos[array1[i].refNo] = array1[i]; 
} 

for(var i = 0 ; i < array2.length ; i++){ 
    //check if key already exists 
    var key = array2[i].refNo; 
    if (uniqueRefNos.hasOwnProperty(key)) { 
     //if it does add the remaining attributes replacing the previous values from array1 
     for (var key2 in array2[i]) { 
     if(array2[i].hasOwnProperty(key2)) { 
      uniqueRefNos[key][key2] = array2[i][key2]; 
     } 
     } 
    } else { 
     //if key doesn't exist add the whole object 
     uniqueRefNos[array2[i].refNo] = array2[i]; 
    } 
} 

Diese alle inneren Objekte in einem Objekt gesetzt werden, die Sie kann geschleift und Dump in ein anderes Array mit:

var finalArray = []; 
for (var key in uniqueRefNos) { 
    if (uniqueRefNos.hasOwnProperty(key)) { 
    finalArray.push(uniqueRefNos[key]); 
    } 
}