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
(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)
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)
Object#values get the list of arraysArray#flat, convert the 2d array into oneArray#reduce, iterate over this list while updating a maxconst 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);