2016-10-21 5 views
1

Sagen Sie bitte eine Sammlung wie dieses:Lodash Update Collection Wo

var sizes = [ 
{label: 'Small', instock: true, onsale: true}, 
{label: 'Medium', instock: false, onsale: true}, 
{label: 'Large', instock: false, onsale: true}, 
]; 

Beachten Sie, dass die Sammlung hier ist wirklich einfach für die Zwecke der Frage, aber in der realen Anwendungsfall könnten die Objekte viel größer sein und komplizierter und mehrmals wiederholt (so muss die Lösung dafür so effizient wie möglich sein).

Ich muss den Bestand von allem, was nicht auf Lager ist zu aktualisieren. Hier ist, was ich bisher versucht:

var index = _.findIndex(sizes, instock:false); 
sizes[index].instock = true; 

Aber es aktualisiert nur 1 der Elemente, in MySQL Sie so etwas wie dies in 1 Zeile Code tun konnte, und ich will versuchen, herauszufinden, wie ähnlich, etwas zu tun in Lashash oder Plain Javascript (mit 1 Funktion oder 1 Zeile Code), weil ich solche Sachen ziemlich häufig machen muss und es wird extrem schwerfällig in einfachem Javascript, es mit einer Schleife zu machen, die manuell über die gesamte Sammlung iteriert.

Der MySQL-Äquivalent wäre so etwas wie:

UPDATE sizes instock=true WHERE instock=false 

ich etwas ähnliches in Lodash oder Plain Javascript tun wollen, was am einfachsten und effizientesten ist.

Eine andere Sache, die ich herausfinden möchte, ist dieses MySQL-Äquivalent.

UPDATE sizes onsale=false WHERE onsale=true AND instock=false 
+0

Alle Bibliotheken werden effektiv die Sammlung durchlaufen. – BenG

Antwort

2

Wenn Sie wollen einfach nur die instock jedes Objekts auf true setzen Sie eine einfache for-Schleife verwenden können

for(var i = 0; i < sizes.length; i++){ 
    sizes[i].instock = true; 
} 

oder mit lodash (die effektiv die gleiche sein wird)

_.each(sizes, function (size){size.instock = true}); 

Beachten Sie, dass wir hier den Wert instock nicht überprüfen, da es nicht darauf ankommt. Wenn instocktrue ist, bleibt es gleich, und wenn es falsch ist, wird es sich ändern. Die Überprüfung auf den Wert unstuck kostet mehr als "unnötigerweise" die Zuweisung von true zu einem Wert, der bereits wahr ist.

Für Ihre zweite Aussage, müssen wir tatsächlich den Wert instock überprüfen, aber nicht vorverkauf, wie wir den Wert von instock in der ersten Anweisung nicht überprüft haben.

_.each(sizes, function (size){ 
    if(!instock) { 
     size.onsale = false; 
    } 
}); 

Wichtig: Ich gehe davon aus, dass die Werte der Variablen, die ich nicht überprüfen sind nie null/undefiniert. Wenn sie geändert werden können und in diesem Fall nicht geändert werden sollen, müssen Sie noch Prüfungen hinzufügen.

1

Der perfektere Weg zur Lösung Ihres Problems wäre die Verwendung einer einfachen for Schleife.

Sie könnten eine Hilfsfunktion haben, um über die Elemente des Arrays zu gehen. Diese Hilfsfunktion könnte eine Funktion als ein Argument erhalten, das die Überprüfung durchführt, um den Schlüssel des Objekts mit dem richtigen Wert zu aktualisieren. Auf diese Weise könnte (auf sehr einfache Weise) die SQL-Aktualisierungsanweisung emuliert werden.

var sizes = [{ 
 
    label: 'Small', 
 
    instock: true, 
 
    onsale: true 
 
}, { 
 
    label: 'Medium', 
 
    instock: false, 
 
    onsale: true 
 
}, { 
 
    label: 'Large', 
 
    instock: false, 
 
    onsale: true 
 
}, ]; 
 

 
function update(arr, key, transformFnc) { 
 
    var i = arr.length, 
 
    obj; 
 
    for (; i !== 0;) { 
 
    obj = arr[--i]; 
 
    obj[key] = transformFnc(obj); 
 
    } 
 
    return arr; 
 
} 
 

 
console.log(update(sizes, 'instock', function(obj) { 
 
    // Returns true when instock is false -> is the same as putting all to true. 
 
    return true; 
 
})); 
 
console.log(update(sizes, 'onsale', function(obj) { 
 
    // Returns false when onsale=true AND instock=false, otherwise, doesn't do anything 
 
    return obj.onsale === true && obj.instock === false ? false : obj.onsale; 
 
}));

Hoffe, es hilft.