【问题标题】:removing duplicate numbers out of both arrays从两个数组中删除重复的数字
【发布时间】:2015-07-28 17:17:48
【问题描述】:

我知道您可以从数组中删除 1 个重复的数字,但是如果它们是重复的,有没有办法可以删除该数字?到目前为止,下面的代码就是我所拥有的。如果它们相等,我想使用 for 循环从数组中删除数字,但我认为我的编码不正确或不完整。我希望它返回 [3, 4, 5]

function sym(args) {
  var array = [];
  var join;
    for(var i = 0; i < arguments.length; i++){
      array.push(arguments[i]);
      join = array[0].concat(array[1]); 
    } 
  join.sort();
    for(var j = 0; j < join.length; j++) {
      if(join[j] === join[j+1]) {

        var removed = join.splice(j, join[j+2]);                 
        console.log(removed);
      }

    }  

  return join;

}

sym([1, 2, 3], [5, 2, 1, 4]);

【问题讨论】:

标签: javascript for-loop duplicate-removal


【解决方案1】:

这是我的看法

function sym() {
  var vals = {};
  var rarray= [];
  var a=arguments;
  for (var i=0,l=a.length;i<l;i++) {
    if (a[i] instanceof Array) {
      for (var n=0,ln=a[i].length;n<ln;n++) {
        vals[a[i][n]]=vals[a[i][n]]||[];
        vals[a[i][n]].push(a[i][n]);
      }
    }
  }
  for (var i in vals) {
    if (vals.hasOwnProperty(i)) {
      if (vals[i].length===1)
        rarray.push(i);
    }
  }
  return rarray;
}

示例:

sym([1, 2, 3], [5, 2, 1, 4]);
// return: ["3", "4", "5"]

sym([1, 2, 3], [5, 2, 1, 4],[4,6,7,8],[8,4]);
// ["3", "5", "6", "7"]

sym([1,2],[1]);
// return: ["2"]

【讨论】:

    【解决方案2】:
    var sym = function (ar1, ar2) {
        return ar1
            .concat(ar2)
            .sort(function (a, b) { return a - b; })
            .filter(function (elem, i, ar) {
                return ar[i-1] !== elem && ar[i+1] !== elem;
            });
        }
    

    【讨论】:

    • 拉德。有些人(包括我自己,显然,从我自己的回答来看)过于关注增长率,并且太快地避免使用干净/简单的排序解决方案(排序解决方案在大多数实际场景中也更快!)完全爱它。我在这里唯一要注意的是数组边界检查:如果排序将undefined 发送到数组的任一端,它将被错误地删除。
    • @DRobinson 我同意undefined,但我假设(从问题中)数组只填充了数字。
    【解决方案3】:

    我喜欢 Crayon Violent 的解决方案,但是当您可以简单地计算重复项时,我看不出维护数组的意义。

    这大大提高了性能 (jsperf),同时还简化了代码。

    function sym() {
      var occurrences = {};
      var inputArrays = arguments;
      var uniqueItems = [];
    
      function addOccurrences(arr) {
        for (var i = 0, len=arr.length; i < len; i++) {
          occurrences[arr[i]] = 1 + (occurrences[arr[i]] || 0);
        }
      }
    
      for (var i=0, len=inputArrays.length; i < len; i++) {
        if (inputArrays[i] instanceof Array) {
          addOccurrences(inputArrays[i]);
        }
      }
    
      for (var item in occurrences) {
        if (occurrences[item] === 1) {
            uniqueItems.push(item);
        }
      }
      return uniqueItems;
    }
    

    如果您的项目中碰巧有下划线或 lodash 可以做得更好:

    function sym() {
      var inputArrays = _.filter(arguments, _.isArray);
      var occurrences = {};
    
      function addOccurrences(arr) {
        _.forEach(arr, function(item){
          occurrences[item] = 1 + (occurrences[item] || 0);
        });
      }
    
      _.forEach(inputArrays, addOccurrences);
    
      // Select the items with one occurence, return the keys (items)
      return _.filter(_.keys(occurrences), function(item){ 
        return occurrences[item] === 1; 
      });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2020-08-09
      • 2011-03-24
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多