Luis Medina
Luis Medina

Reputation: 555

Javascript get largest object in array of objects

I want to get the largest object in an array of objects, the code I'm using works fine, but I wonder if there is a better way of doing the same. This is the code I'm using.

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

Upvotes: 2

Views: 809

Answers (4)

Dmitry Reutov
Dmitry Reutov

Reputation: 3032

To sort the whole array seems stupid, one loop is enough using reduce function

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

Upvotes: 1

ABGR
ABGR

Reputation: 5205

I think one loop is sufficient to do this.

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

Upvotes: 4

Teneff
Teneff

Reputation: 32158

An example using Array.prototype.reduce

const [biggestObject] = data.reduce(
  ([acc, length], entry) => {
    const len = Object.keys(entry).length;
    return length > len ? [acc, length] : [entry, len];
  },
  [{}, 0]
);

Upvotes: 2

Ahmed Hammad
Ahmed Hammad

Reputation: 3085

You can just sort the array using the criteria you used for filling the len array.

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

Result:

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}

Upvotes: 0

Related Questions