Как в некорректном массиве объектов получить максимальное значение?
Ошибка из за того что одно значение с пустым объектом, пробовал проверку добавлять, но все равно не срабатывает
Как в reduce пропустить такое значение?
let obj = [
{},
{ season: 2 },
{ season: 9 },
{ season: 5 },
];
let type = 'season';
let max = Object.values(obj).reduce((p, c) => (p[type] < c[type]) ? c : p)[type];
console.log(max);
let max2 = Object.values(obj).reduce((p, c) => c[type] !== undefined ? ((p[type] < c[type]) ? c : p) : 0)[type];
console.log(max2);
Ответы (3 шт):
Как в некорректном массиве объектов получить максимальное значение?
Предложу такой вариант нахождения максимального элемента в массиве...
let a = [
{},
{ season: 2 },
{ season: 9 },
{ season: 5 },
];
const max = Math.max(...a.map(o => o.season ?? -Infinity))
console.log(max)
Еще вариант...
let a = [
{},
{ season: 2 },
{ season: 9 },
{ season: 5 },
];
const max = a.reduce((m, o) => Math.max(m, o.season ?? -Infinity), -Infinity)
console.log(max)
Попытаюсь объяснить где именно Вы ошиблись, в обоих случаях ошибка в том что Вы не указываете начальное значение для reduce, но во втором случае еще чуть более сложный вариант — в тернарнике где подставляете 0 в качестве ответа, должен быть объект со свойством равным 0. Наличие свойств лучше проверять через hasOwnProperty и да начальный минимум лучше брать за -Infinity как указано в ответе @ksa
let max3 = Object.values(obj)
.reduce((p, c) => (p[type] < c[type]) ? c : p,
{[type]: 0} // этого не было указано
)[type];
console.log(max3);
let max4 = Object.values(obj).reduce((p, c) =>
c.hasOwnProperty(type)
? (p[type] < c[type] ? c : p)
: {[type]:0}, // вместо 0
{[type]: 0})[type] // не было указано
console.log(max4);
Замечания:
Я не очень понял зачем вам вообще
Object.values, в вашем случае, можно к массиву сразу применятьreduceВы не указади начальное значение для
reduce, а потому он взял как начальное значение первый элемент - пустой объектНаличие свойтсва отедельно проверять не вижу смысла, можно просто воспользоваться оператором нулевого слияния (??) и если нет, то подставить минус бесконечность
const objects = [
{},
{ season: 2 },
{ season: 9 },
{},
{ season: 5 },
];
const max = objects.reduce((max, object) => {
const value = object.season ?? -Infinity;
return value > max ? value : max;
}, -Infinity);
console.log(max);