数组之间的对称差异

时间:2016-07-21 08:16:17

标签: javascript arrays algorithm

我一直在编写代码,以便在一个或多个数组之间产生对称差异。如您所知,对称差异是排除两组数据中的元素。更多信息:https://en.wikipedia.org/wiki/Symmetric_difference

这是我的代码:



  //This function drops any repeated element from a vector
    function unify(arr){
        var result=arr.reduce(function(vector,num,index,self){
         var len=self.filter(function (val){
           return val===num;
         }).length;
        if (len>1){
          var pos=self.indexOf(num);
          self.splice(pos,1);
        }
        vector=self;
        return vector;
        },[]);
      
      return result;
    }
    
    function sym(args) {
      var arg = Array.prototype.slice.call(arguments); 
      var compact= arg.map(function(vector){
        return unify(vector);
      });
      
      //We compare the vectors and delete any repeated element before we concat them
      return compact.reduce(function(prev,next,index,self){
        for (var key in next) {
          var entry=next[key];
          var pos=prev.indexOf(entry);
          if (pos!==-1){
            prev.splice(pos,1);
            next.splice(key,1);
          }
            
        }
        return prev.concat(next);
      });
      
    }
    
    console.log(sym([1, 2, 3], [5, 2, 1, 4]));




我不明白我做错了什么。我希望得到[3,4,5]的结果,但这不是我得到的结果。

1 个答案:

答案 0 :(得分:1)

进行拼接时,会更改数组的索引。所以它会跳过一些值。

在您的示例中,prev = [1,2,3]next = [5,2,1,4]

第一次拼接@ key = 1后,两个数组看起来都像prev = [1,3]next = [5,1,4]。下一个键是2,它会跳过1中的条目next。由于拼接,该索引已向左移动一个。

我的解决方案(抱歉,我正在通过手机,否则我会编写代码)

  1. 编写一个更有意义的循环,并仅在必要时增加密钥。 因此,如果存在拼接,则不要增加,因为可能是下一个 条目已转移到当前密钥。
  2. 如果必须保留for a in b - 类型循环,请考虑重复但不变 next数组
  3. 的参考