簡體   English   中英

將對象數組優化為僅組中的最新對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM