【问题标题】:Removing elements in an array using Lodash使用 Lodash 删除数组中的元素
【发布时间】:2015-01-20 02:15:08
【问题描述】:

我有这个数组:

var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];

我像这样使用 Lodash 的 remove

_.remove(fruits, function (fruit) {
  return fruit === 'Apple' || 'Banana' || 'Orange';
})

结果是['Apple', 'Banana', 'Orange', 'Celery'],而我预计它是['Apple', 'Banana', 'Orange']。为什么会这样?

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    因为当fruit"Celery" 时,你正在测试:

    "Celery" === 'Apple' || 'Banana' || 'Orange'
    

    计算结果为

    false || true || true
    

    这是true

    您不能使用该语法。要么做很长的路要走:

    _.remove(fruits, function (fruit) {
      return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange'
    });
    

    或测试数组成员:

    _.remove(fruits, function (fruit) {
      return _.indexOf(['Apple', 'Banana', 'Orange'], fruit) !== -1
    });
    

    这不仅限于 JavaScript,实际上是一个常见的错误(例如this question

    【讨论】:

    • 为什么不用_.includes 而不是_.indexOf
    【解决方案2】:

    您可以在 lodash 2.0 及更高版本中使用 _.pull 方法

    var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
    
    _.pull(fruits, 'Apple', 'Banana', 'Orange'); // ['Celery']
    
    document.write(fruits);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>

    【讨论】:

      【解决方案3】:

      如果您想从另一个集合中删除一组项目,则有专门为此而设计的集合操作。 Lodash 有https://lodash.com/docs/4.17.2#difference,它接受两个数组参数 A 和 B,并将返回另一个数组,其中包含 A 中不在 B 中的所有元素。

      在你的情况下,你可以写

      const fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
      const filteredFruits = _.difference(fruits, ['Apple', 'Banana', 'Orange']);
      

      这将导致['Celery']

      【讨论】:

        【解决方案4】:

        问题不在于 Lo-Dash;您的问题在于您的回调函数中的条件。这个:

        return fruit === 'Apple' || 'Banana' || 'Orange';
        

        正确。您需要将fruit 与每个字符串进行实际比较:

        return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange';
        

        或者,你可以使用另一个Lo-Dash函数来让它更紧凑一点:

        _.remove(fruits, function (fruit) {
          return _.contains(['Apple', 'Banana', 'Orange'], fruit);
        })
        

        注意:在最新版本的 Lo-Dash 中,_.contains 函数已被弃用。请使用_.includes

        【讨论】:

          【解决方案5】:

          使用您要比较的值数组,并检查返回的索引是否大于 -1。这表明在集合中找到了评估的值。

          _.remove( fruits, function ( fruit ) {
            return _.indexOf( [ "Apple", "Banana", "Orange" ], fruit ) >= 0;
          });
          

          您也可以使用lo-dash's _.contains method 来获得布尔响应。

          您采用的方法的问题是您没有将fruit 与这些字符串中的每一个进行比较;相反,唯一发生的比较是 fruit"Apple",之后您将自己强制字符串。

          非空字符串强制转换为 true (!!"Banana"),因此是 truthy。因此,以下条件将始终在“香蕉”处短路(除非fruit 严格等于"Apple"),返回true

          return fruit === "Apple" || 'Banana' || "Orange";
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-12
          • 2019-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多