2016-07-21 2 views
0

Я писал код, чтобы сделать симметричную разницу между или несколькими массивами. Как вы знаете, симметричная разница заключается в исключении элементов, которые находятся в обоих наборах данных. Более подробная информация: 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], но это не результат, который я получаю.

+0

нам действительно нужно смотреть Видеосервис YouTube, чтобы понять ваш вопрос делать? Кроме того, мы действительно не знаем, что вы делаете неправильно, потому что вы не описали проблему! – Jamiec

+0

жаль расстраивать вас, я не знал, что такое симметричная разница, пока я не увидел видео. С другой стороны, если вы выполните код, вы увидите, что он не выполняет то, что я описываю (симметричная разность). Что нужно мне описать? – galeonweb

+0

Что * делает * делаю, какой * should * делаю. Создайте [mcve] для демонстрации. – Jamiec

ответ

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 массива
+0

Спасибо Яски! – galeonweb