Reputation: 610
I have an object of objects. Within those objects are arrays, that have more objects. Below is the structure.
I want to find out what the longest array of objects is within the parent object. So in my example below:
For ObjectOne - the longest array is B.
For ObjectTwo, the longest array is C.
mainobj = {
ObjectOne: {
A: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 2}
],
B: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'}
],
C: [
{ x: 'd', y: 'e'}
]
},
ObjectTwo:{
A: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'}
],
B: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'}
],
C: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'}
]
}
}
I can do this:
var size = Object.values(mainobj).length
but I don't know how to get deeper than that. For instance, this doesn't work:
var size = Object.values(mainobj)[0].length
This question is pretty similar, but I can't figure out how to apply it. I appreciate the help!
Upvotes: 1
Views: 653
Reputation: 13356
You can convert your objet to keep only arrays which have the max length:
var mainObj = {
1:{
A: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 2}
],
B: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'}
],
C: [
{ x: 'd', y: 'e'}
]
},
2:{
A: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'}
],
B: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'}
],
C: [
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'},
{ x: 'd', y: 'e'}
]
}
};
var res = {};
Object.keys(mainObj).forEach(key => {
var maxLength = 0, nameOfmaxLenghtArray, maxLenghtArray;
Object.keys(mainObj[key]).forEach(arrayName => {
if (mainObj[key][arrayName].length > maxLength) {
maxLengthArrayName = arrayName;
maxLenghtArray = mainObj[key][arrayName];
maxLength = mainObj[key][arrayName].length;
}
});
res[key] = { [maxLengthArrayName ]: maxLenghtArray};
});
console.log('res: ', res);
// You can then access the max length array for each sub-object of mainobj:
var subObject = '1';
var maxLengthArrayName = Object.keys(res[subObject])[0];
var maxLengthArray = Object.values(res[subObject])[0];
console.log(`max length array name for sub-object ${subObject}: `, maxLengthArrayName);
console.log(`max length array for sub-object ${subObject}: `, maxLengthArray );
Upvotes: 0
Reputation: 386654
You could return an object for each outer key and get an array with the largest inner array's keys.
var object = { objectOne: { A: [{ x: 'd', y: 'e' }, { x: 'd', y: 2 }], B: [{ x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }], C: [{ x: 'd', y: 'e' }] }, objectTwo: { A: [{ x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }], B: [{ x: 'd', y: 'e' }, { x: 'd', y: 'e' }], C: [{ x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }] } },
result = Object.keys(object).map(function (k) {
var o = object[k];
return {
key: k,
items: Object.keys(o).reduce(function (r, l, i) {
if (!i || o[r[0]].length < o[l].length) {
return [l];
}
if (o[r[0]].length === o[l].length) {
r.push(l);
}
return r;
}, [])
};
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 2