2016-10-21 71 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; 
 
}));

希望它能帮助。