2017-05-21 4 views
0

一般的な問題や、オブジェクト内の日付を変更して時系列のリストに結合することで他の人が恩恵を受けるようなものについては助けが必要です。全体的な目標は、今年で開催される特別な日付のすべてを反映したリストを作成することです:Javascriptはオブジェクトの日付をループして結合します

 
1 Jan - Sharpe's Anniversary 
2 May - Edward's Birthday 
12 Dec - Zero's Anniversary 
etc... 

私はこれを表現するオブジェクトを作成することから始めました。次に、比較を行うだけで最初の出現の順序でそれらを並べ替えることはありませんが、年間をスライスが、年間ベースを与えるでしょう。次に日付を時間順に並べ替えるために比較を実行します。その後、一致する人物のIDで結果をログアウトします。

これまで、私はそれを動作させました。しかし、私はこれを繰り返す方法を知らず、ドライにしています。記念日のためにこれを実行して、そしてカスタム機能を何らか作成せずに誕生日にするのは間違いでしょう。すべての私の試みはうまく終わらなかった。

誰かがより洗練されたソリューションを持っていますか?ここでは、コミュニティへ

ありがとう:)

// Sample data 
 

 
var items = [{ 
 
    name: 'Edward', 
 
    anniversary: "2015-01-23", 
 
    birthday: "1988-05-02" 
 
    }, 
 
    { 
 
    name: 'Sharpe', 
 
    anniversary: "2017-01-01", 
 
    birthday: "1988-05-10" 
 
    }, 
 
    { 
 
    name: 'And', 
 
    anniversary: "2018-05-10", 
 
    birthday: "1988-06-12" 
 
    }, 
 
    { 
 
    name: 'The', 
 
    anniversary: "1988-08-11", 
 
    birthday: "1979-03-12" 
 
    }, 
 
    { 
 
    name: 'Magnetic', 
 
    anniversary: "2017-01-05", 
 
    birthday: "1956-06-21" 
 
    }, 
 
    { 
 
    name: 'Zeros', 
 
    anniversary: "1990-12-12", 
 
    birthday: "1935-07-23" 
 
    } 
 
]; 
 

 
// Slice out the year so that dates are annualized 
 

 
for (var i = 0; i < items.length; i++) { 
 
    items[i].anniversary = items[i].anniversary.slice(5, 10); 
 
}; 
 

 
// Sort dates in chronological order 
 
items.sort(function(a, b) { 
 
    return new Date(a.anniversary) - new Date(b.anniversary); 
 
}); 
 

 
// Console.log the dates with their associated name 
 

 
for (var i = 0; i < items.length; i++) { 
 
    console.log(items[i].anniversary + " " + items[i].name); 
 
}

答えて

0

あなたは "1988年8月11日" あなたは「取得08-11のような日から今年削除します"これを組み込みのDateパーサーで解析すると、元の日付が8月11日の場合、無効な日付または11月1日の日付が取得されます。パーサーは年と月を見て、欠けている日には1を使います。

しかし、慎重にしないでください! ISO 8601の日付書式は文字列としてソートすることができます。あなたはそのままで、日付ではなく文字列としてソートできます。

// Sample data 
 
var items = [{ 
 
    name: 'Edward', 
 
    anniversary: "2015-01-23", 
 
    birthday: "1988-05-02" 
 
    }, 
 
    { 
 
    name: 'Sharpe', 
 
    anniversary: "2017-01-01", 
 
    birthday: "1988-05-10" 
 
    }, 
 
    { 
 
    name: 'And', 
 
    anniversary: "2018-05-10", 
 
    birthday: "1988-06-12" 
 
    }, 
 
    { 
 
    name: 'The', 
 
    anniversary: "1988-08-11", 
 
    birthday: "1979-03-12" 
 
    }, 
 
    { 
 
    name: 'Magnetic', 
 
    anniversary: "2017-01-05", 
 
    birthday: "1956-06-21" 
 
    }, 
 
    { 
 
    name: 'Zeros', 
 
    anniversary: "1990-12-12", 
 
    birthday: "1935-07-23" 
 
    } 
 
]; 
 

 
// Get the events 
 
var specialDates = items.reduce(function(acc, item) { 
 
    acc.push([item.name, item.anniversary.substr(5), 'Anniversary'], [item.name, item.birthday.substr(5), 'Birthday']); 
 
    return acc; 
 
}, []).sort(function (a, b) { // sort on month 
 
    return a[1].localeCompare(b[1]); 
 
}).map(function(event) {  // Replace month number with short name 
 
    var months = [,'Jan','Feb','Mar','Apr','May','Jun', 
 
       'Jul','Aug','Sep','Oct','Nov','Dec']; 
 
    return [event[0], months[+event[1].split('-')[0]] + ' ' + event[1].substr(3), event[2]]; 
 
}); 
 

 
// Write result 
 
specialDates.forEach(function(event) { 
 
    console.log(event[1] + ': ' + event[0] + ' ' + event[2]); 
 
});

これは少し賢くなり、あなたが望む限り多くのイベントタイプを追加し、それらをハードコーディングされていないことができるように元のオブジェクトからイベント名を取得し、そのオブジェクトができ

var items = [{ 
    name: 'Edward', 
    events: { 
     anniversary: "2015-01-23", 
     birthday: "1988-05-02" 
    } 
    }, 
    ... 

はまたnew Date("2015-01-23")は、UTC(タイムゾーンは+00のオフセット:00)として文字列を扱うことに注意してください :よう、グリニッジの西のホストのように、日付が前日のように見えるかもしれません。

+0

ロブこれは完璧な答えです。私はこのスマートなバージョンにも興味があります。あなたはどうやってそのようにしますか? –

0
let goal = items 
.map(({ name, anniversary }) => ({ name, 'anniversary': anniversary.slice(5, 10) })) 
.sort(({ 'anniversary': a }, { 'anniversary': b }) => { 
    if(a > b) return 1; 
    if(a < b) return -1; 
    return 0; 
} 
.map(({ name, anniversary }) => anniversary + ' ' + name); 

goal.forEach(item => { console.log(item); }); 
関連する問題