Je veux obtenir le plus gros objet d'un tableau d'objets, le code que j'utilise fonctionne bien, mais je me demande s'il existe une meilleure façon de faire de même. C'est le code que j'utilise.

data=[
    {group: "a", A: 65, N: 20}, 
    {group: "b", R: 52}, 
    {group: "c", N: 20, A: 2, R: 2},
    {group: "d", R: 15, N: 12},
]

len = []
for (var i in data){
    len.push(Object.keys(data[i]).length)
}

for (var i in data){
    if (Object.keys(data[i]).length==Math.max.apply(null, len)){
      subgroups = Object.keys(data[i]).slice(1).sort();
    }
}

console.log(subgroups);
2
Luis Medina 2 juin 2020 à 17:02

4 réponses

Meilleure réponse

Je pense qu'une boucle suffit pour cela.

var data=[
{group: "a", A: 65, N: 20}, 
{group: "b", R: 52}, 
{group: "c", N: 20, A: 2, R: 2},
{group: "d", R: 15, N: 12},
],

max = Object.keys(data[0]).length,
largestObj = data[0];


data.forEach(i=>{
  if(Object.keys(i).length> max){
    max = Object.keys(i).length;
    largestObj = i;
  }
});

console.log(max);
console.log(largestObj);
4
ABGR 2 juin 2020 à 14:15

Vous pouvez simplement trier le tableau en utilisant les critères que vous avez utilisés pour remplir le tableau len.

data.sort((x, y) => {
  return Object.keys(y).length - Object.keys(x).length
});

Résultat:

0: {group: "c", N: 20, A: 2, R: 2}
1: {group: "a", A: 65, N: 20}
2: {group: "d", R: 15, N: 12}
3: {group: "b", R: 52}
0
Ahmed Hammad 2 juin 2020 à 14:10

Pour trier tout le tableau semble stupide, une boucle suffit en utilisant la fonction de réduction

const { element } = data.reduce((agg, element) => {
  const length = Object.keys(v).length
  if (length > agg.length) {
    return { element, length }
  } 
  return agg
}, { element: null, length: 0 })
1
Dmitry Reutov 2 juin 2020 à 14:24

Un exemple utilisant Array.prototype.reduce

const [biggestObject] = data.reduce(
  ([acc, length], entry) => {
    const len = Object.keys(entry).length;
    return length > len ? [acc, length] : [entry, len];
  },
  [{}, 0]
);
2
Teneff 2 juin 2020 à 14:12