Мне интересно понять, что происходит внутри этого алгоритма.Давайте рассмотрим следующий набор данных:
const data = [
{
emp_code: "a001",
company_code: "company_a",
name: "abx",
details: [],
details_dtypes: []
},
{
emp_code: "b002",
company_code: "company_b",
name: "xbz ",
details: [],
details_dtypes: []
},
{
emp_code: "a002",
company_code: "company_a",
name: "xbz ",
details: [],
details_dtypes: []
},
{
emp_code: "b003",
company_code: "company_b",
name: "xbz ",
details: [],
details_dtypes: []
}
];
Теперь, если бы я хотел сжать эти данные до object {}
, где каждый ключ является уникальным company_code
, а соответствующее ему значение - array []
из emp_codes
для этой компании я мог бы сделать что-то вроде:
let result = data.reduce((r, c) => {
r[c.company_code] = [...(r[c.company_code] || []), c.emp_code];
return r;
}, {});
Выше мы явно возвращаем конечный объект, который кажется очень ясным.
Теперь я недавно обнаружилчто вы можете сократить это с помощью некоторого синтаксического сахара, например, так:
let result = data.reduce(
(r, c) =>
(r[c.company_code] = [...(r[c.company_code] || []), c.emp_code]) && r,
{}
);
Результаты идентичны, но я не уверен, насколько это возможно.Насколько я понимаю, reduce()
состоит в том, что существует внутренний цикл, который перебирает каждый элемент и позволяет вам применять определенную логику для формулирования вашего конечного результата.Я вижу, что они используют оператор &&
.Моя гипотеза состоит в том, что логика между круглыми скобками ()
выполняется как традиционный метод reduce()
, и когда она завершена, мы просто возвращаем результат, следовательно && r
.
Но что-то в этом просто кажется неправильным.Внутренняя петля все еще происходит?Если это так, как они могут изолировать его таким образом, не выполняя условие после первой итерации, возвращая, таким образом, r
.Они возвращают r
для каждой итерации цикла?
Вот песочница, которая показывает оба алгоритма: https://codesandbox.io/s/hooks-with-reduce-nested-data-goee1. Большое спасибо за ваш вклад:)