Javascript уменьшить сокращение не возвращая объект - PullRequest
0 голосов
/ 04 июля 2018

Почему один работает, а другой нет?

const b = {
  age: 20,
  name: "John Doe"
}

const sortedB = Object.entries(b).sort().reduce((acc, [key, val]) => acc[key] = val,{});

Выход: Джон Доу

В верхней части пропущены квадратные скобки, в которых указано, что они возвращаются автоматически. Внизу написано, что используйте фигурные скобки, что означает, что вы должны возвращать вручную

  const sortedB = Object.entries(b).sort().reduce((acc, [key, val]) => {
    acc[key] = val;
    return acc;
  },{});

Вывод: {возраст: 20, имя: "Джон Доу"}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Как уже объяснялось в другом ответе, нет способа, как acc[key] = val выражение может автоматически возвращать , потому что оно оценивается как val, а не acc.

Рецепт, который удобно использовать в функции reduce в ES6: Object.assign, поскольку он возвращает объект, который расширяет:

Object.entries(b).sort().reduce((acc, [key, val]) => Object.assign(acc, { [key]: val }) ,{});

Это дороже, чем acc[key] = val; return acc, но может использоваться в некритических местах (в местах, критичных к производительности Object.entries и reduce тоже не приветствуются) и может использоваться с подразумеваемым возвратом стрелки.

0 голосов
/ 04 июля 2018

В верхней части пропущены квадратные скобки, в которых говорится, что возврат автоматически

Нет, это не то, что это значит. Как / почему JavaScript должен знать, что нужно вернуть acc?

Если у вас есть функция со стрелкой, в которой в качестве тела используется только выражение, возвращается результат этого выражения. И результатом присваивания является значение, которое было присвоено. Пример:

var func = () => 1;
console.log(func()); // 1

func = x => x;
console.log(func(42)) // 42

func = (x, y) => y = 42;
console.log(func(1,2)); // 42

func = x => (x, 42);
console.log(func(21)); // 42

func = x => (42, x);
console.log(func(21)); // 21

Если вы хотите, чтобы значение acc было возвращено, вы должны убедиться, что выражение соответствует этому значению, например, с запятой:

 (acc, [key, val]) => (acc[key] = val, acc)
 //                    ^^^^^^^^^^^^^^^^^^^
 //  the comma operator returns the result of the right expression
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...