2017-07-11 16 views
0

質問:最新の効果の日付ごとに各グループからオブジェクトをフィルタリング/摘み取るにはどうすればよいですか?プロパティでネストされたデータのセットをフィルタリングする方法は?

code sample On repl.it

const isLatestDate = (prev, test) => { 
    return test.effectiveDate > prev.effectiveDate; 
}; 

var groupedByName = { 
    abc: 
    [ { name: 'abc', effectiveDate: '2016-01-01T00:00:00+00:00' }, 
     { name: 'abc', effectiveDate: '2016-04-01T00:00:00+00:00' }, 
     { name: 'abc', effectiveDate: '2016-05-01T00:00:00+00:00' } ], 
    abcd: 
    [ { name: 'abcd', effectiveDate: '2016-02-01T00:00:00+00:00' }, 
     { name: 'abcd', effectiveDate: '2016-09-01T00:00:00+00:00' } ] 
    } 
// let output = groupedByKeyNames.reduce((acc, item) =>{ 
//  acc[item]=[acc[item].sort((a,b)=>(new Date(a.effectiveDate))-(new Date(b.effectiveDate))).pop()]; 
// },{}) 
let groupedByKeyNames = Object.keys(groupedByName); 

let output = groupedByKeyNames.reduce((acc, item) => { 
    // does key exsist 
    // yes - skip 
    // no - add it. 
    if(!acc[item]){ 
    acc[item] = {}; 
    } 
    acc[item] = groupedByName[item]; 

    return acc; 

    // return acc[item] = item; 
}, {}); 
console.log(output) 
// pluck/filter out by latest effectDates 



// EXPECTED OUTPUT 
// { 
// abc: [ 
//  { name: 'abc', effectiveDate: '2016-05-01T00:00:00+00:00' } 
// ], 
// abcd: [ 
//  { name: 'abcd', effectiveDate: '2016-09-01T00:00:00+00:00' } 
// ] 
// } 
+0

あなたのコードは何をしていますか?何をしていないのですか?何が問題ですか? – samanime

+0

Theres識別子がありません。 –

+0

識別子が見つからない問題を修正しました。質問を簡略化しようとした –

答えて

1

私はこのようなSTHを行うことができ、あなたがオブジェクトをしたい場合youreの配列に減少理由を知らない:

let groupedByKeyNames = Object.keys(groupedByName); 
// pluck/filter out by latest effectDates 
let output = groupedByKeyNames.reduce((acc, item) =>{ 
    acc[item]=[groupedByName[item].sort((a,b)=>(new Date(a.effectiveDate))-(new Date(b.effectiveDate))).pop()]; 
    return acc; 
},{}); 

http://jsbin.com/lawumineyu/edit?console

+0

ええ、配列への削減は私の部分で間違いだった。 \t 動作していないようです。私はreplとliveコードで更新しました。http://repl.it/JXUW/1 私も話すように、私はそれをyoruの答えで修正しようとしています。 –

+1

@Matthewああ、私はいつもアキュムレータを返すことを忘れています.../ –

0

ソート機能により、任意の配列を最後の日付を取得する

function getLast(arr){ 
    var sorted = arr.sort(function(a,b){ 
     var aDate = new Date(a).getTime(), 
      bDate = new Date(b).getTime(); 
     if(bDate == aDate){ 
      return 0; 
     } 
     else{ 
      return aDate > bDate? -1 : 1; 
     } 
    }); 
    //first is lastest 
    return sorted[0]; 
} 

var arr = [ 
     { name: 'first', effectiveDate: '2016-02-01T00:00:00+00:00' }, 
     { name: 'last', effectiveDate: '2016-09-01T00:00:00+00:00' } 
     ]; 

getLast(arr);//name: 'last', effectiveDate: '2016-09-01T00:00:00+00:00' 

//full code 

data = { 
    abc: 
    [ { name: 'abc', effectiveDate: '2016-01-01T00:00:00+00:00' }, 
     { name: 'abc', effectiveDate: '2016-04-01T00:00:00+00:00' }, 
     { name: 'abc', effectiveDate: '2016-05-01T00:00:00+00:00' } ], 
    abcd: 
    [ { name: 'abcd', effectiveDate: '2016-02-01T00:00:00+00:00' }, 
     { name: 'abcd', effectiveDate: '2016-09-01T00:00:00+00:00' } ] 
    } 
var allKeys = Object.keys(data), 
newData = {} 
for(var i=0; i < allKeys.length;i++){ 
    newData[allKeys[i]] = [getLast(data[allKeys[i]])]; 
} 
+0

動作していないようです。私はreplとlive codeで更新しました。https://repl.it/JXUW/1 –

+0

arr .sort –

+0

OK、今すぐテストされ、動作しています。とにかく、キーはgetLast関数です – anysite

関連する問題