I have an object containing arrays of objects. I'm trying to find the highest value of an object property, 'sortOrder' without manually iterating through the arrays and objects.
So my variable looks like this following:
const myObj = {
people: [
0: {firstname: 'Dave', lastName: 'Jones', sortOrder: 22},
1: {firstname: 'Jane', lastName: 'Smith', sortOrder: 11}
],
otherPeople: [
0: {firstname: 'Jen', lastName: 'SomeLastName', sortOrder: 33},
1: {firstname: 'ExampleFirstName', lastName: 'ExampleLastName', sortOrder: 12}
]
};
So I'd be trying to iterate through this to eventually find, in this case, the highest sortOrder of 33. Not necessarily the array index or the object containing it, just the number.
Thanks
CodePudding user response:
- Using
Object#values
get the list of arrays - Using
Array#flat
, convert the 2d array into one - Using
Array#reduce
, iterate over this list while updating amax
const myObj = {
people: [ {firstname: 'Dave', lastName: 'Jones', sortOrder: 22}, {firstname: 'Jane', lastName: 'Smith', sortOrder: 11} ],
otherPeople: [ {firstname: 'Jen', lastName: 'SomeLastName', sortOrder: 33}, {firstname: 'ExampleFirstName', lastName: 'ExampleLastName', sortOrder: 12} ]
};
const maxSortOrder =
Object.values(myObj)
.flat()
.reduce((max, { sortOrder = 0 }) => sortOrder > max ? sortOrder : max, 0);
console.log(maxSortOrder);
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>
CodePudding user response:
(I had to slightly correct your input data: arrays don't include the index number as you're showing.)
Easiest to combine the two arrays in the object into one list and then use reduce to find the maximum:
const myObj = {
people: [
{
firstname: 'Dave',
lastName: 'Jones',
sortOrder: 22
},
{
firstname: 'Jane',
lastName: 'Smith',
sortOrder: 11
}
],
otherPeople: [
{
firstname: 'Jen',
lastName: 'SomeLastName',
sortOrder: 33
},
{
firstname: 'ExampleFirstName',
lastName: 'ExampleLastName',
sortOrder: 12
}
]
};
let allPeople = [...myObj.people, ...myObj.otherPeople];
let max = allPeople.reduce((maxSort, person) => {
return Math.max(maxSort, person.sortOrder)
}, 0));
console.log(max)
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>
CodePudding user response:
You can order them by the highest sortOrder and then take the higher of the highest elements in each array:
const myObj = {
people: [{
firstname: 'Dave',
lastName: 'Jones',
sortOrder: 22
},
{
firstname: 'Jane',
lastName: 'Smith',
sortOrder: 11
}
],
otherPeople: [{
firstname: 'Jen',
lastName: 'SomeLastName',
sortOrder: 33
},
{
firstname: 'ExampleFirstName',
lastName: 'ExampleLastName',
sortOrder: 12
}
]
};
Object.values(myObj).forEach(peopleArray => {
peopleArray.sort((a, b) => b.sortOrder - a.sortOrder)
})
let maxValue = Math.max(myObj.people[0].sortOrder, myObj.otherPeople[0].sortOrder)
console.log(maxValue)
<iframe name="sif3" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>
CodePudding user response:
const myObj = {
people: [
{firstname: 'Dave', lastName: 'Jones', sortOrder: 22},
{firstname: 'Jane', lastName: 'Smith', sortOrder: 11}
],
otherPeople: [
{firstname: 'Jen', lastName: 'SomeLastName', sortOrder: 33},
{firstname: 'ExampleFirstName', lastName: 'ExampleLastName', sortOrder: 12}
]};
let maxSortOrder = 0;
for (const value of Object.values(myObj)) {
maxSortOrder = value.reduce((acc, { sortOrder }) => sortOrder > acc ? sortOrder : acc, maxSortOrder);
};
console.log(maxSortOrder); //33