【问题标题】:Filtering out specific values from an array从数组中过滤掉特定值
【发布时间】:2015-11-28 11:46:14
【问题描述】:

destroyer([1, 2, 3, 1, 2, 3], 2, 3) 应该返回 [1, 1],但它返回 [1, 2, 3, 1, 2, 3]。这段代码有什么问题?

function destroyer(arr) {
  // Remove all the values
  var arg_num = arguments.length;

  var new_arr = arguments[0].filter(function(a){
    for (var i = 1; i < arg_num; i++){
      if (a === arguments[i]) a = false; 
    }
    return a;
  });

  return new_arr;
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

【问题讨论】:

    标签: javascript arrays function web


    【解决方案1】:

    argument 用于获取当前函数的参数列表。在执行您使用参数的过滤器时,它会提供过滤器方法的参数。它不同于 destroyer 方法参数

    所以将destroyer方法参数存储在一个变量中。 试试这个代码。

    function destroyer(arr) {
    // Remove all the values
    var args = arguments;
    var arg_num = args.length;
    var flag;
    var new_arr = arguments[0].filter(function (a) {
      flag = false;
      for (var i = 1; i < arg_num; i++) {
        if (a === args[i]) {
          flag = true;
          break;
        };
      }
      if (flag)
        return false;
      else
        return true;
    });
    return new_arr;
    }
    console.log(destroyer([0, 2, 3, 0, 2, 3], 0, 3));

    希望这会对你有所帮助。

    【讨论】:

    • 当数组中的值为0时,您的函数将不起作用。您需要返回 true 或 false 而不是元素。
    • 试试这个jsfiddle.net/exj1zux7/2 如果值为0 并且它不是要删除的列表,它将从过滤器中返回该元素,这是虚假的,它不会在列表中。
    • @jcubic 是的,你说得对,现在我更新了我的代码。感谢您的信息。
    【解决方案2】:

    您可以改为使用 lodash 库中的 difference 函数。这是一个经过良好测试和广泛使用的实用程序库。

    var _ = require('lodash');
    
    var result = _.difference([1, 2, 3, 1, 2, 3], [2, 3])); // returns [1, 1]
    

    【讨论】:

    • “应该”是一个强词,因为 OP 没有使用 lodash。
    • @Oriol 应该替换为 can :)
    【解决方案3】:

    问题是arguments关键字通常绑定到当前函数,在这种情况下是filter中使用的匿名函数。

    ES6 允许通过引入arrow functions, which don't bind arguments 轻松解决此问题。

    (function destroyer(arr) {
      var arg_num = arguments.length;
      return arguments[0].filter(a => {
        for (var i = 1; i < arg_num; i++){
          if (a === arguments[i]) return false;
        }
        return true;
      });
    })([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1]
    

    但是,请注意此函数的成本为 n m,其中 n 是数组中的元素数量,m 是附加参数的数量。但可能会更好。

    例如,如果附加参数始终是数字,您可以对它们进行排序,然后使用二分搜索。这将花费n lg(m)

    另一种方法是使用哈希表。在最坏的情况下仍会花费n m,但平均只需n

    如果您不想手动实现,可以使用 ES6 集。它的具体成本将取决于实现,但要求平均是次线性的。

    (function destroyer(arr, ...args) {
      var s = new Set(args);
      return arr.filter(a => !s.has(a));
    })([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1]
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 2023-04-08
    • 2020-02-13
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多