2

Date オブジェクトの 2 つの配列を一意にマージしようとしていますが、適切な方法では取得できません。これが私のnoobソリューションです:

$old = [new Date('2012-08-01'), new Date('2012-08-02'), new Date('2012-08-03')];
$new = [new Date('2012-08-01'), new Date('2012-08-06')];

$old2 = $.map($old, function(el, idx) {
   for (var i in $new)
   {
      if ($new[i].getTime() == el.getTime()) return null;
   }
   return el;
});

$new2 = $.map($new, function(el, idx) {
   for (var i in $old)
   {
      if ($old[i].getTime() == el.getTime()) return null;
   }
   return el;
});

$final = $.merge($old2, $new2);

これは機能しますが、ちょっと面倒なようで、パフォーマンスが悪いと思いますか?私が行った別の試みはこれでした:

for (var i in $new)
{
   var found = false;

   for (var j in $old)
   {
      if ($old[j].getTime() == $new[i].getTime())
      {
         found = true;
         $old = $old.splice(j, 1);
      }
   }

   if (found)
   {
      $new = $new.splice(i, 1);
   }
}

$final = $.merge($old, $new);

しかし、これはまったく機能しません。それを正しくかつ効率的に行う方法は?

4

1 に答える 1

3

あなたがそれらを注文したいと仮定すると、これはうまくいくはずです:

$old = [new Date('2012-08-01'), new Date('2012-08-02'), new Date('2012-08-03')];
$new = [new Date('2012-08-01'), new Date('2012-08-06')];

var second = $old.concat($new);
var sorted_second = second.sort(); // You can define the comparing function here. 
                         // JS by default uses a crappy string compare.
var results = [];
for (var i = 0; i < second.length - 1; i++) {
    if (sorted_second[i + 1] != sorted_second[i]) {
        results.push(sorted_second[i]);
    }
}    

このコードの一部は、並べ替えをさらに深くする必要がある場合に備えて、hereから取得されました

于 2012-07-25T10:49:08.993 に答える