Lodash更新集合在哪里

时间:2016-10-21 14:19:30

标签: javascript 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;

但它只更新其中一项,在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

2 个答案:

答案 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的值,因为它并不重要。如果instocktrue,则它将保持不变,如果为false,则会发生变化。检查unstuck的价值是否超过&#39;不必要地&#39;将true分配给已经为真的值。

对于你的第二个陈述,我们确实需要检查instock的值,而不是onsale,就像我们在第一个语句中没有检查instock的值一样。

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

重要提示:我假设我没有检查的变量的值永远不会为null / undefined。如果它们可以并且在这种情况下不应该被更改,那么您仍然需要添加检查。

答案 1 :(得分:1)

解决问题的更多方法是使用普通的for循环。

你可以有一个辅助函数来遍历数组的元素。这个辅助函数可以接收一个函数作为参数来进行检查,以便用适当的值更新对象的密钥。这样,它可以(以非常简单的方式)模拟SQL更新语句。

&#13;
&#13;
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;
&#13;
&#13;

希望它有所帮助。