Кто может любезно объяснить приведенную ниже конструкцию аккумулятора acc простым английским языком?
return arr1.reduce(function(acc, curr){
var last = acc[acc.length-1];
if(acc.length > 0 && curr[1]===last[1]) {
last[0] += curr[0];
} else acc.push(curr);
return acc;
}, []);
}
Этот reduce
метод можно использовать для решения задачи FreeCodeCamp Inventory Update в рамках их расширенных уроков по написанию сценариев алгоритмов.
Требуется обновить существующие элементы в массиве инвентаря (arr1) новыми элементами в новом массиве доставки.
Два тестовых массива, текущий инвентарь curInv и новый доставленный newInv соответственно, могут быть следующими:
var curInv = [
[21, "Bowling Ball"],
[2, "Dirty Sock"],
[1, "Hair Pin"],
[5, "Microphone"]
];
var newInv = [
[2, "Hair Pin"],
[3, "Half-Eaten Apple"],
[67, "Bowling Ball"],
[7, "Toothpaste"]
];
Найдя несколько отличных статей о методе сокращения Javascript (например, этот пост и отличный видеокурс на egghead.io), и каким-то образом почувствовав силу, которую он исчерпывает, я бы прочитал этот метод следующим образом:
Уменьшите инвентарный массив, создав сначала пустой массив [] (начальное значение), а затем применив следующую функцию обратного вызова:
Если массив инвентаря в настоящее время не пуст (имеет длину больше нуля), а имя обрабатываемого в данный момент элемента (например, индекс 0 curr может читать Bowling Ball) идентично последнему элементу обновляемого массива инвентаря, тогда обновить количество этого предмета в массиве инвентаря.
Последний элемент определяется прямо над оператором if следующим образом: возьмите текущую длину накопленного массива до настоящего момента, вычтите 1 и используйте это значение для индексации накопленного массива. Затем элемент с этим индексом присваивается переменной last.
С другой стороны, если инвентарь пуст, добавьте новый предмет полностью, то есть: имя и количество предмета. Теперь верните только что накопленный массив. *
Каким образом использование
length - 1
аккумулятора полезно для фактического накопления acc? (простите за аллитерацию)
Думаю, я понимаю большую часть того, как построен этот метод сокращения, но, пожалуйста, поправьте меня везде, где я ошибаюсь), кроме этого конкретного использования acc.length-1
.
Ура, к.