【发布时间】:2019-11-05 22:28:10
【问题描述】:
我有兴趣了解此算法内部发生的情况。让我们考虑以下数据集:
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。非常感谢您的贡献:)
【问题讨论】:
-
两个代码是相同的,在第二个代码中,对于每个唯一的 company_code,您要添加所有 emp_code 并返回对象 r。
-
当执行
foo && bar之类的东西时,会返回最后一个被解释的值。 -
有些人为此使用逗号:
reduce (acc, x) => do_stuff, acc,以便在任何情况下都返回累加器。 -
@georg 和
,你需要在(acc, x) => (do_stuff, acc)周围加上括号,否则, acc将被解释为reduce的第二个参数
标签: javascript arrays ecmascript-6