【问题标题】:Lodash Update Collection WhereLodash 更新集合在哪里
【发布时间】:2016-10-21 14:19:30
【问题描述】:

假设你有一个这样的集合:

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 或 Plain 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

【问题讨论】:

  • 所有库都将有效地循环集合。

标签: javascript lodash


【解决方案1】:

如果您只想将每个对象的 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,它将保持不变,如果它是假的,它将改变。检查unstuck 的值比“不必要地”将true 分配给一个已经为真的值要花费更多。

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

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

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

【讨论】:

    【解决方案2】:

    解决问题的更高效方法是使用普通的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;
    }));

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-17
      • 2020-03-14
      • 2023-03-12
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多