2016-11-08 3 views
1

Ich fragte mich gerade, ob jemand mir helfen könnte. Ich habe eine Array-Liste voller Objekte, jedes Objekt enthält eine Gruppennummer und ein Datum. Ich möchte ein neues Array erstellen, das nur einen Eintrag pro Gruppennummer enthält. Dieser einzige Eintrag sollte das neueste Objekt in dieser Gruppe sein (mit dem Datumswert).verfeinern Objekt-Array zu nur neuesten in Gruppe

Zum Beispiel könnte die vollständige Palette sein:

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' 
    }, 
] 

aber die kam aus dem neuen Array sein soll:

[ 
    { 
     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' 
    }, 
] 

Ist das möglich und wenn ja, was die meisten wären effizienter Weg, dies zu erreichen? Ich benutze eckig, aber wenn es möglich ist, möchte ich keine zusätzlichen Bibliotheken mitbringen.

Danke.

+0

ist immer die Eingabe-Array nach Datum sortiert? –

Antwort

2

Sie könnten eine Hash-Tabelle und Array#reduce mit Austausch verwenden, wenn ein neueres Datum gefunden wird.

Dieser Vorschlag funktioniert mit unsortierten Daten.

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

Ich schlage eine 3-Phasen-Algorithmus:
1/sortieren Array auf Group Elemente gleichen Group haben adjascent werden
2/gerade Elemente von Group gruppiert halten, die das sind jüngste
3/finaly das letzte Element der sortierten Array hinzufügen, da es

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);
übereinstimmen wird

1

Man könnte folgendermaßen vorgehen;

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);

Verwandte Themen