web-dev-qa-db-ja.com

Angular 2:2つの日付の間のレコードをフィルタリングする方法?

{
 "id":1,
 "name":"Jack",
 "date":"01-06-2017"
},
{
 "id":2,
 "name":"Allen",
 "date":"07-08-2017"
},
{
 "id":3,
 "name":"Annie",
 "date":"22-11-2017"
},

「メンバー」配列に保存されたこのJSONは、次のように開始日と終了日に基づいてメンバーをフィルタリングします。

 let startDate;
 let endDate;
 let selectedMembers = this.members.filter(m => m.date > startDate && m.date < endDate);

そんな感じ..

5
M Rameez

答えてくれてありがとう。これが私の問題の解決策です

{
 "id":1,
 "name":"Jack",
 "date":"01-06-2017"
},
{
 "id":2,
 "name":"Allen",
 "date":"07-08-2017"
},
{
 "id":3,
 "name":"Annie",
 "date":"22-11-2017"
},

let start = "01-02-2017;
let end = "06-07-2017";

let.selectedMembers = this.members.filter(
m => new Date(m.date) >= new Date(startDate) && new Date(m.date) <= new Date(endDate)
);

console.log(selectedMembers);

あなたのすべての回答に感謝します、それは私がこれを理解するのに役立ちます:) ..

3
M Rameez

日付形式を逆にし、比較のために[〜#〜] timestamp [〜#〜]に変換する必要があります。

members = [{
 "id":1,
 "name":"Jack",
 "date":"01-06-2017"
},
{
 "id":2,
 "name":"Allen",
 "date":"07-08-2017"
},
{
 "id":3,
 "name":"Annie",
 "date":"22-11-2017"
}];

const startDate ="25-06-2017";
const  endDate = "10-11-2017";

// Here reverse the date format & then convert to TIMESTAMP
function reverseAndTimeStamp(dateString) {
const reverse = new Date(dateString.split("-").reverse().join("-"));
return reverse.getTime();
}
 // A simple array filter like what you did
 const  selectedMembers = members.filter(m => { 
 return reverseAndTimeStamp(m.date) > reverseAndTimeStamp(startDate) && reverseAndTimeStamp(m.date) < reverseAndTimeStamp(endDate)
 }
 );
 
  console.log(selectedMembers); // the result objects
1
Melchia

u日付を適切に比較するために、まず日付を文字列から日付型に変換してから、次のような処理を行う必要があります。

let members: any[] = [{
        "id": 1,
        "name": "Jack",
        "date": "01-06-2017" // this should be of object Date()
    },
    {
        "id": 2,
        "name": "Allen",
        "date": "07-08-2017" // this should be of object Date()
    },
    {
        "id": 3,
        "name": "Annie",
        "date": "22-11-2017" // this should be of object Date()
        }];

    let start = "01-02-2017;  // this should be of object Date()
    let end = "06-07-2017"; // this should be of object Date()

        let selectedMembers = members.filter(m => {
          if ( m.date > start && m.date < end) // or you can cast here to Date()
            return m;
    });

    console.log(selectedMembers);
1
Allain

文字列として保存されている日付を並べ替えるには、ISOベースの形式を使用する必要があります。 https://es.wikipedia.org/wiki/ISO_8601

あなたが書いた行はそのような日付で動作します:

{  "id":1,  "name":"Jack",  "date":"2017-06-01" }, 
{  "id":2,  "name":"Allen",  "date":"2017-08-07" }, 
{  "id":3,  "name":"Annie",  "date":"2017-11-22" }

そうでない場合は、文字列を日付オブジェクトに解析して、比較で使用する必要があります。このようなもの:

let startDate = new Date('2017-05-01');
 let endDate = new Date('2017-09-01);
 let selectedMembers = this.members.filter(m => new Date(m.date) > startDate && new Date(m.date) < endDate);
1
Siro

フランスの日付形式を使用するため、文字列と日付オブジェクトの間に独自のトランスフォーマーが必要です。

次に、Date JavaScriptオブジェクトとタイムスタンプ表現を処理する必要があります。

このようなものが機能します。

function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  // note parts[1]-1
  return new Date(parts[2], parts[1]-1, parts[0]).getTime();
}

let startDate = parseDate('01-06-2017');
let endDate = parseDate('01-06-2018');

let selectedMembers = this.members.filter(m => {
    const current = parseDate(m.date);
    return current > startDate && current < endDate;
});
0
Yanis-git