2016-10-21 108 views
1

說你有一個這樣的集合:Lodash更新集合,其中

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

請注意,這裏的集合是此問題的目的很簡單,但在實際使用情況的對象可能會更大並且更復雜和重複多次(所以解決方案需要儘可能高效)。

我需要將所有沒有存貨的庫存更新爲真。以下是我試過到目前爲止:

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

但它僅更新項目1,在MySQL中,你可以做這樣的事情在1行的代碼,我想嘗試找出如何做同樣的事情在Lodash或簡單的Javascript(有1個函數或1行代碼),因爲我必須做這樣的事情,而不是頻繁的,它變得非常繁瑣,在普通的JavaScript做一個循環手動迭代整個集合。

MySQL的等價物會是這樣的東西:

UPDATE sizes instock=true WHERE instock=false 

我想要做的Lodash或普通的JavaScript,類似的東西無論是最簡單,最有效的。

我試圖弄清楚如何做的另一件事是這個MySQL的等價物。

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

所有圖書館將有效地循環收集。 – BenG

回答

2

如果你只是想設置每個對象爲true,你可以使用一個簡單的for循環

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

或lodash(這將是有效的相同)

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

請注意,我們並沒有在這裏檢查instock的值,因爲這並不重要。如果instocktrue,它將保持不變,如果它是假的,它將會改變。檢查值unstuck的成本超過「​​不必要地」將true分配到已經爲真的值。

對於你的第二條語句,我們確實需要檢查instock的值,但不是onsale,就像我們在第一條語句中沒有檢查到instock的值。

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

重要:我假設我沒有檢查變量的值總是空/未定義。如果他們可以並且在這種情況下不應該改變,那麼你仍然需要添加檢查。

1

解決您的問題的更多perfomant方式將使用普通的for循環。

你可以有一個幫助函數來檢查數組的元素。這個幫助函數可以接收一個函數作爲一個參數,該函數將執行檢查以更新具有適當值的對象的關鍵字。這樣,它可以被仿真(以一種非常簡單的方式)SQL更新語句。

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

希望它能幫助。