假设您有这样的集合:
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;
但它只更新其中一项,在MySQL中你可以在一行代码中做这样的事情,我想试着弄清楚如何在Lodash或Plain Javascript中做类似的事情(1个函数或1行代码)因为我必须经常做这样的事情,并且在普通的javascript中变得非常麻烦,用循环手动迭代整个集合。
MySQL的等价物将是:
UPDATE sizes instock=true WHERE instock=false
我想在Lodash或Plain Javascript中做类似的事情,无论什么是最简单和最有效的。
我试图弄清楚该怎么做的另一件事是这个MySQL等价物。
UPDATE sizes onsale=false WHERE onsale=true AND instock=false
答案 0 :(得分:2)
如果您只想将每个对象的instock
设置为true,则可以使用简单的for循环
for(var i = 0; i < sizes.length; i++){
sizes[i].instock = true;
}
或与lodash(实际上将是相同的)
_.each(sizes, function (size){size.instock = true});
请注意,我们未在此处检查instock
的值,因为它并不重要。如果instock
为true
,则它将保持不变,如果为false,则会发生变化。检查unstuck
的价值是否超过&#39;不必要地&#39;将true
分配给已经为真的值。
对于你的第二个陈述,我们确实需要检查instock
的值,而不是onsale,就像我们在第一个语句中没有检查instock的值一样。
_.each(sizes, function (size){
if(!instock) {
size.onsale = false;
}
});
重要提示:我假设我没有检查的变量的值永远不会为null / undefined。如果它们可以并且在这种情况下不应该被更改,那么您仍然需要添加检查。
答案 1 :(得分:1)
解决问题的更多方法是使用普通的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;
}));
&#13;
希望它有所帮助。