[英]refining object array to only latest in group
我只是想知道是否有人可以幫助我。 我有一個充滿對象的數組列表,每個對象都包含一個組號和一個日期。 我想做的是創建一個新數組,其中每個組號僅包含一個條目。 該唯一條目應該是該組中的最新對象(使用日期值)。
例如,完整的數組可能是這樣的:
var objectArray [
{
groupNumber: '1'
date: '01/01/2016'
},
{
groupNumber: '2'
date: '02/01/2016'
},
{
groupNumber: '3'
date: '03/01/2016'
},
{
groupNumber: '2'
date: '04/01/2016'
},
{
groupNumber: '3'
date: '05/01/2016'
},
{
groupNumber: '4'
date: '06/01/2016'
},
{
groupNumber: '5'
date: '07/01/2016'
},
{
groupNumber: '2'
date: '08/01/2016'
},
{
groupNumber: '2'
date: '09/01/2016'
},
]
但是新數組的結果應該是:
[
{
groupNumber: '1'
date: '01/01/2016'
},
{
groupNumber: '2'
date: '09/01/2016'
},
{
groupNumber: '3'
date: '05/01/2016'
},
{
groupNumber: '4'
date: '06/01/2016'
},
{
groupNumber: '5'
date: '07/01/2016'
},
]
這可能嗎?如果可以,最有效的方法是什么? 我正在使用angular,但如果可能的話,我不想引入任何其他庫。
謝謝。
如果找到較新的日期,則可以使用哈希表和Array#reduce
進行交換。
該建議適用於未排序的數據。
var objectArray = [{ groupNumber: '1', date: '01/01/2016' }, { groupNumber: '2', date: '02/01/2016' }, { groupNumber: '3', date: '03/01/2016' }, { groupNumber: '2', date: '04/01/2016' }, { groupNumber: '3', date: '05/01/2016' }, { groupNumber: '4', date: '06/01/2016' }, { groupNumber: '5', date: '07/01/2016' }, { groupNumber: '2', date: '08/01/2016' }, { groupNumber: '2', date: '09/01/2016' }], hash = Object.create(null), result = objectArray.reduce(function (r, a) { if (!(a.groupNumber in hash)) { hash[a.groupNumber] = r.push(a) - 1; return r; } if ((new Date(r[hash[a.groupNumber]].date)) < (new Date(a.date))) { r[hash[a.groupNumber]] = a; } return r; }, []); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我提出了一個三階段算法:
1 /對groupNumber上的數組排序,使具有相同groupNumber的元素相鄰
2 /只需按最小的groupNumber分組元素
3 /最后添加已排序數組的最后一個元素,因為它將匹配
var objectArray = [{ groupNumber: '1', date: '01/01/2016' }, { groupNumber: '2', date: '02/01/2016' }, { groupNumber: '3', date: '03/01/2016' }, { groupNumber: '2', date: '04/01/2016' }, { groupNumber: '3', date: '05/01/2016' }, { groupNumber: '4', date: '06/01/2016' }, { groupNumber: '5', date: '07/01/2016' }, { groupNumber: '2', date: '08/01/2016' }, { groupNumber: '2', date: '09/01/2016' }]; var results = []; var sortedArray = objectArray.sort((a,b) => a.groupNumber - b.groupNumber); sortedArray.forEach((x,i,arr) => { if (i < arr.length-1 && x.groupNumber !== arr[i+1].groupNumber) results.push(x); }); results = results.concat(sortedArray.slice(-1)); console.log(results);
一個人可以做如下:
var arr = [ { groupNumber: '1', date: '01/01/2016' }, { groupNumber: '2', date: '02/01/2016' }, { groupNumber: '3', date: '03/01/2016' }, { groupNumber: '2', date: '04/01/2016' }, { groupNumber: '3', date: '05/01/2016' }, { groupNumber: '4', date: '06/01/2016' }, { groupNumber: '5', date: '07/01/2016' }, { groupNumber: '2', date: '08/01/2016' }, { groupNumber: '2', date: '09/01/2016' } ], res = [...arr.reduce((m,c) => { var o = m.get(c.groupNumber); return o ? Date(o.date) > Date(c.date) ? m : m.set(o.groupNumber,c) : m.set(c.groupNumber,c); }, new Map()) .values()]; console.log(res);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.