Реагировать js переименовать и деструктурировать длину массива - PullRequest
5 голосов
/ 23 января 2020

У меня есть функция уменьшения, как показано ниже:

let el = scopes.reduce ((tot, {actions}) => tot + actions.length, 0);

Я пытался преобразовать это так, но кажется, что это не правильный путь:

let el = scopes.reduce ((tot, {actions.length: len}) => tot + len, 0);

Есть ли способ сделать это или это невозможно.

1 Ответ

7 голосов
/ 23 января 2020

Вы были близки, но вы используете вложение, а не точечную запись:

// 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 из моей новой книги (см. Мой профиль для ссылок):

Figure 7-1 from JavaScript: The New Toys


Вы также можете использовать сокращенную запись и использовать 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
...