Чтобы понять, что происходит, вы должны задаться вопросом, что уменьшает делает:
При первом вызове обратного вызова аккумулятор и currentValue могут принимать одно из двух значений. Если initialValue предоставлен в вызове redu (), то аккумулятор будет равен initialValue, а currentValue будет равен первому значению в массиве. Если значение initialValue не указано, аккумулятор будет равен первому значению в массиве, а currentValue будет равен второму.
Если вы предоставляете пустой массив без начального значения, скажите:
[].reduce(() => {})
Тогда это больше не имеет смысла, поскольку вы не можете ни получить доступ к первому элементу массива, ни использовать начальное значение. Все, что вам нужно сделать, это предоставить начальное значение:
myArray.reduce(() => {}, [])
Поскольку ваша функция уменьшения использует числа и вы хотите найти их максимальное число, вы можете использовать -Infinity в качестве начального значения:
myArray.reduce((acc, curr) => Math.max(acc, curr), -Infinity)
Итак, для вашего случая использования:
function addLastRowClass() {
$(".blocks_section").each(function() {
var $grid_item = $(this).find(".news_box");
var maxTop = $grid_item.removeClass("last-row").map(function() {
var $item = $(this)
return $item.position().top;
}).get().reduce((acc, curr) => (curr > acc) ? curr : acc, -Infinity) //<--- Initial value provided here
$grid_item.filter(function() {
var $item = $(this)
return $item.position().top == maxTop;
}).addClass("last-row");
});
}
Если заметить, что вы можете использовать деструктуризацию массива, вы можете просто сделать следующее:
function addLastRowClass() {
$(".blocks_section").each(function() {
var $grid_item = $(this).find(".news_box");
var topPositions = $grid_item
.removeClass("last-row")
.map((i, el) => $(el).position().top)
.get();
var max_top = Math.max(...topPositions); // <-- Here
$grid_item
.filter((i, el) => $(el).position().top == maxTop)
.addClass("last-row");
});
}
Редактировать
Просто заметил, что вы пытались сделать там. Ваша проблема возникнет только тогда, когда в сетке нет элементов, но в этом случае вам нечего делать, поэтому еще один способ сделать это - проверить длину элементов перед обработкой:
function addLastRowClass() {
$(".blocks_section").each(function() {
var $grid_item = $(this).find(".news_box");
if($grid_item.length) {
var maxTop = $grid_item.removeClass("last-row").map(function() {
var $item = $(this)
return $item.position().top;
}).get().reduce((acc, curr) => (curr > acc) ? curr : acc)
$grid_item.filter(function() {
var $item = $(this)
return $item.position().top == maxTop;
}).addClass("last-row");
}
});
}