Вы были близки, но вы используете вложение, а не точечную запись:
// Outer −−−−−−−−−−−−−−−−−−−−v−−−−−−−−−−−−−−−−−−−−−−v
let el = scopes.reduce((tot, {actions: {length: len}}) => tot + len, 0);
// Inner −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^−−−−−−−−−−−−^
Live Пример:
const scopes = [
{actions: [1, 2, 3]},
{actions: []},
{actions: [4, 5]}
];
let el = scopes.reduce((tot, {actions: {length: len}}) => tot + len, 0);
console.log(el); // 5
Ключевым моментом, который следует помнить при деструктурировании, является то, что синтаксис идентичен литералам объекта и массива с вложенностью; просто поток информации - это другое направление. Например, в литерале объекта данные передаются справа налево от источника (source
) к цели (prop
):
let source = 42;
let obj = {prop: source};
// <−−−−−*
при деструктурировании, потоки данных идут слева направо от источника (prop
) до цели (target
):
let {prop: target};
// *−−−−−>
console.log(target); // 42
, и целью может быть переменная, свойство объекта или даже другой шаблон разрушения. Это то, что мы используем выше: целью свойства actions
является шаблон деструктурирования {length: len}
, который помещает значение length
в переменную len
. Вот рисунок 7-1 из моей новой книги (см. Мой профиль для ссылок):
Вы также можете использовать сокращенную запись и использовать length
в вашем обратном вызове:
let el = scopes.reduce((tot, {actions: {length}}) => tot + length, 0);
Live Пример:
const scopes = [
{actions: [1, 2, 3]},
{actions: []},
{actions: [4, 5]}
];
let el = scopes.reduce((tot, {actions: {length}}) => tot + length, 0);
console.log(el); // 5