【问题标题】:Is it possible to slightly modify my symmetric difference function so that it can accept an unknown number of arguments?是否可以稍微修改我的对称差分函数,以便它可以接受未知数量的参数?
【发布时间】:2016-04-14 11:15:32
【问题描述】:

我在尝试查找包含两个或多个数组的对称差的数组时创建了这个 codepen http://codepen.io/PiotrBerebecki/pen/ZWxvzm

我的函数可以正常工作,但前提是传递了四个参数。如何修改我的函数以使其可以接受未知数量的参数?有一个潜在可重复的代码块可能是 for 循环或 reduce / map 方法的一部分。我不知道如何做到这一点。

symmetricDifference([1,2,3,4], [3,4,5,6], [2,4,6,7], [8,9])
// should return an array containing [1,4,5,7,8,9]

symmetricDifference([1,2,3,4], [3,4,5,6])
// should return an array containing [1,2,5,6]

var arrA = [1,2,3,4];
var arrB = [3,4,5,6];
var arrC = [2,4,6,7];
var arrD = [8,9];

function symmetricDifference(arr) {
  let args = Array.prototype.slice.call(arguments);
  let result = [];

  result = args[0].concat(args[1]).filter(function(item) {
    return args[0].indexOf(item) === -1 || args[1].indexOf(item) === -1;
  });

  result = result.concat(args[2]).filter(function(item) {
    return result.indexOf(item) === -1 || args[2].indexOf(item) === -1;
  });

  result = result.concat(args[3]).filter(function(item) {
    return result.indexOf(item) === -1 || args[3].indexOf(item) === -1;
  });

  return result;
}

【问题讨论】:

  • 是的,在args 上使用简单的for 循环。如果您没有成功,请向我们展示您的尝试。
  • 提示:以var result = args[0];开头
  • 总是四人一组吗?将您的参数分成四组,然后循环这些组,选择组中的四个元素中的每一个,就像您在示例中一样。
  • @Bergi 我已经实现了您的提示,并且该功能按要求工作。

标签: javascript function for-loop filter reduce


【解决方案1】:

感谢@Bergi 的提示,我引入了for 循环和初始值var result = args[0]; 该函数现在可以正常工作,因为它接受未知数量的参数。我已经更新了原始的 codepen (http://codepen.io/PiotrBerebecki/pen/ZWxvzm) 来演示这个实现。

function symmetricDifference(arr) {
  let args = Array.prototype.slice.call(arguments);
  let result = args[0];
  for (var i = 1; i < args.length; i++) {
    result = result.concat(args[i]).filter(function(item) {
      return result.indexOf(item) === -1 || args[i].indexOf(item) === -1;
    });
  }
  // remove duplicates and sort
  return Array.from(new Set(result)).sort((a, b) => a - b);
}

【讨论】:

  • 让循环从1 运行到args.length 更容易。也没有理由引入 temp 变量,您只能在 result 上工作。
  • 我刚刚更新了loop 条件并根据您的提示删除了不必要的temp 变量。代码现在看起来干净多了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多