Je sais que, il y a d'innombrables questions sur le groupe par une propriété à partir d'une gamme d'objets. Mais ce que je veux faire, c'est un litte plus spécifique: résultat doit être regroupé par groupe de groupe et trié par index p> (index ici sont les itérateurs 0,1,2 , 3 ... donc pas besoin d'être trié mais plutôt d'être placé dans un bon ordre d'un tableau. Exemple: Array [index] = ...). P> Cela devrait ressembler à: < / p> J'ai essayé de regrouper sans tri: p> et avec le tri, pas réussi, mais vous savez ce que je veux dire : p> Toutes les suggestions sont appréciées p> p>
5 Réponses :
Essayez comme ça
p>
const lists = [
{ groupKey: 'ABC', key: 'r8', timestamp: '2014', index: 2 },
{ groupKey: 'ABC', key: 'q8', timestamp: '2012', index: 0 },
{ groupKey: 'ABC', key: 'w8', timestamp: '2013', index: 1 },
{ groupKey: 'CDE', key: 'r7', timestamp: '2019', index: 0 }
]
var groupBy = function(datas, key) {
return datas.reduce(function(data, x) {
var dKey = x[key];
delete x[key];
(data[dKey] = data[dKey] || []).push(x);
return data;
}, {});
};
console.log(groupBy(lists, 'groupKey')); Vous êtes presque là-bas, il vous suffit de trier après em> le p> Réduire code> est terminé: const lists = [{
groupKey: 'ABC',
key: 'r8',
timestamp: '2014',
index: 2
},
{
groupKey: 'ABC',
key: 'q8',
timestamp: '2012',
index: 0
},
{
groupKey: 'ABC',
key: 'w8',
timestamp: '2013',
index: 1
},
{
groupKey: 'CDE',
key: 'r7',
timestamp: '2019',
index: 0
}
]
const result = lists.reduce((r, item) => {
const { groupKey, ...rest } = item
r[groupKey] = [...(r[groupKey] || []), rest];
return r;
}, {})
Object.values(result).forEach((arr) => {
arr.sort((a, b) => a.index - b.index);
});
console.log(result);
Vous pouvez commencer par premier groupe par les touches, puis vous devez trier en fonction de l'index
p>
const lists = [{ groupKey: 'ABC', key: 'r8', timestamp: '2014', index: 2 },{ groupKey: 'ABC', key: 'q8', timestamp: '2012', index: 0 }, { groupKey: 'ABC', key: 'w8', timestamp: '2013', index: 1 },{ groupKey: 'CDE', key: 'r7', timestamp: '2019', index: 0 } ]
// group by groupkey
let grouped = lists.reduce((op, inp) => {
let groupKey = inp.groupKey
op[groupKey] = op[groupKey] || []
op[groupKey].push(inp)
return op
},{})
// sort by index
let output = Object.entries(grouped).reduce((op,[key,value]) => {
value = value.sort((a,b)=> a.index-b.index)
op[key] = value
return op
},{})
console.log(output)Vous pouvez prendre l'index directement sans tri ultérieur.
p>
.as-console-wrapper { max-height: 100% !important; top: 0; }Essayez ceci:
const result = lists.reduce((r, item) => {
let { groupKey, ...rest } = item
r[item.groupKey] = [...(r[item.groupKey] || []), rest];
(r[item.groupKey]).sort((a, b) => a.index - b.index);
return r
}, {});
Comme indiqué dans la question en double, il est beaucoup plus facile de trier d'abord, puis de la groupe:
_ (données) .Sorteby ("index"). Groupby ("groupey"). Valeur () Code>