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>