2017-05-17 23 views
1

anglejsのアプリケーションでは、文字列ではなくユニークな日付の配列だけを返すためにフィルタリングする必要がある配列の配列を受け取ります。私はSOの答えのいくつかを試しましたが、私は文字列ではなく日付を比較していると思います。私は別の結果を生み出しています。最良のアプローチが何であるかについての助けは非常に役に立ちます。 enter image description here日付配列からユニークな日付の配列を返します

答えて

1

あなたが正しいです、日付平等は文字列の平等とは異なります。 2つの日付は決して互いに等しいことはありません。それでは、ただ文字列に日付を入れてみましょう:

indexOf

let dates = [new Date(), new Date('1/1/11'), new Date('1/1/11'), new Date('1/4/66')] 
 

 

 
let uniqueDates = dates 
 
        .map(s => s.toString()) 
 
        .filter((s, i, a) => a.indexOf(s) == i) 
 
        .map(s => new Date(s)); 
 
        
 
console.log(uniqueDates);

ロジックは、すべての一意の値のみ、自身の位置に存在しなければならないということです。他のものは重複しています(sは現在のアイテム、iは現在のインデックス、aは配列そのものです)。次に配列をDatesにマップして返します。

+1

ありがとうございます - あなたのコードのリファクタリングは、上にチェリーでした。文字列に変換してから日付を戻すというアイデアを無視して前回よりも複雑化していたと思います。 – chris

+1

問題ありません!それを考えると、 '.toString()'を '.getTime()'に置き換える方が簡単です。それは単純な数、エポック時間として日付を返します。クリーナーで、文字列を比較するよりも少し効率的です。 – joh04667

1

あなたはlodashを使用している場合:

const date1 = new Date(); 
const date2 = new Date(); 
const arr = [date1, date1, date2, date2]; 
const uniqueDates = _.uniqBy(arr, date => date.getTime()); 

は、我々は彼らの値によってだけではなく、オブジェクトのアイデンティティで日付を比較することを確実にするためにuniqByを使用します。ここをクリックしてください:Compare two dates with JavaScript

関連する問題