2016-03-20 10 views
0

Ich schrieb diese Funktion, um doppelte Objekte zu kombinieren und ihre Mengen hinzuzufügen.Zugriff auf Objekt in einigen() -Funktion in Javascript verwendet

Ich habe Probleme, die Mengen hinzuzufügen.

Ich nehme an, dass "Element" nur innerhalb der Funktion some() erstellt und verwendet wird und nicht mehr zugänglich ist. Wie kann ich diese Funktion reparieren, so dass ich ihre Eigenschaften bearbeiten kann?

Ex:

vor Funktion:

var product_array = [ 
    {model:1, quantity:3}, 
    {model:1, quantity:2}, 
    {model:2, quantity:1} 
]; 

nach Funktion:

var product_array = [ 
    {model:1, quantity:5}, 
    {model:2, quantity:1} 
] 
+0

Kann fügen Sie vor/nach Beispielen für Ihre Arrays? – Andy

+0

@Andy Nur ein Beispiel hinzugefügt. – Suavocado

+0

'item' ist nicht außerhalb von' .some() 'definiert. Was ist der Zweck, sich 'Menge' des gleichen' Items' hinzuzufügen? Was ist das erwartete Ergebnis? – guest271314

Antwort

1

Sie haben Recht, Artikel werden nur in dem Pfeil Funktionsumfang zugänglich sein.

Sie können die Unterstreichungsfunktion (oder lodash) .find dafür verwenden.

Zum Beispiel:

var item = _.find(new_array, {model : unmerged.model}); 
if (item) { 
    item.quantity += unmerged.quantity; 
} 

Sie können auch es6 neue Array-Funktionen für das

var item = new_array.find(elem => elem.model ===unmerged.model); 
+0

die zweite option funktioniert wunderbar, die lodash-version scheint aus irgendeinem grund nicht. – Suavocado

+0

Noch besseres Muster ist ein Reducer. – okonetchnikov

+0

Ich habe die erste Option mit lodash ausprobiert und es funktioniert perfekt für mich, bist du sicher, dass du lodash zu deinem Projekt hinzugefügt hast? Wie auch immer, wenn Sie es6 benutzen, empfehle ich die zweite Option, die erste Option ist einfach die einfache Methode in es5. – kutomer

0

Für ES5 verwenden, ist dies nicht die eleganteste Lösung, aber man kann es wie folgt tun:

function comparator(obj1, obj2) { 
    if (obj1.model < obj2.model) return -1; 
    if (obj1.model > obj2.model) return 1; 
    return 0; 
} 

function combineDuplicates(arr, comparator) { 
    arr.sort(comparator); 

    for (var i = 0; i < arr.length - 1; i++) { 
    while (arr[i + 1] !== undefined && arr[i].model === arr[i + 1].model) { 
     arr[i].quantity += arr[i + 1].quantity; 
     arr.splice(i + 1, 1); 
    } 
    } 

    return arr; 
} 

Grundsätzlich Sie das Array sortieren und dann die Schleife durch. Es gibt eine zweite Schleife, die die Anzahl der Duplikate hinzufügt und anschließend das Duplikat entfernt. Nicht sehr effizient, aber es funktioniert.

Beispiel:

var product_array = [ 
    {model:1, quantity:3}, 
    {model:1, quantity:2}, 
    {model:2, quantity:1}, 
    {model:1, quantity:10}, 
    {model:1, quantity:10}, 
    {model:1, quantity:10}, 
    {model:2, quantity:5} 
]; 

var new_product_array = combineDuplicates(product_array, comparator); 
console.log(new_product_array); // [ { model: 1, quantity: 35 }, { model: 2, quantity: 6 } ] 
1

Sie Element einer Variablen zuweisen kann, dass im Umfang ist und verwenden, die:

input.forEach(function(unmerged){ 
    var current; 
    if(new_array.some(item => {current = item; return item.model === unmerged.model})){ 
    current.quantity += unmerged.quantity; ////this throws error 
    } else { 
    new_array.push(unmerged); 
    } 
}); 
0

Sie this im forEach Schleife verwenden kann als ein temporäres Objekt zum Zusammenführen.

function removeDuplicates(input) { 
 
    var new_array = []; 
 
    input.forEach(function (unmerged) { 
 
     if (!this[unmerged.model]) { 
 
      this[unmerged.model] = unmerged; 
 
      new_array.push(unmerged); 
 
      return; 
 
     } 
 
     this[unmerged.model].quantity += unmerged.quantity; 
 
    }, {}); 
 
    return new_array; 
 
}; 
 

 
var product_array = [{ model: 1, quantity: 3 }, { model: 1, quantity: 2 }, { model: 2, quantity: 1 }], 
 
    result = removeDuplicates(product_array); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

Verwandte Themen