带有逗号运算符的箭头函数中的奇怪错误

时间:2018-11-11 09:13:59

标签: javascript

const bifurcate = (arr, filter) =>
  arr.reduce((acc, val, i) => (acc[filter[i] ? 0 : 1].push(val), acc), [[], []]);
  const r = bifurcate(['beep', 'boop', 'foo', 'bar'], [true, true, false, true]);
  console.log(r); // [ [ 'beep', 'boop', 'bar' ], [ 'foo' ] ]

我试图了解代码的工作原理。 我首先要做的是尝试在reduce函数的回调中使用console.log来查看那里的值。但是我失败了,因为我无法在函数中放置console.log

// FAILURE CODE
const bifurcate = (arr, filter) =>
  arr.reduce((acc, val, i) => {
    return (acc[filter[i] ? 0 : 1].push(val), acc), [[], []];
});

这是我遇到的错误:

ERROR : TypeError: acc[(intermediate value)(intermediate value)(intermediate value)].push is not a function at arr.reduce (C:\Users\1nept\project\Connector\test.js:19:36)

据我所知,如果箭头函数中没有大括号,则返回值就是箭头后的表达式结果。 因此,上归约代码是相同的。

但令人惊讶的是,最下面的一个导致错误。 我不知道为什么。

1 个答案:

答案 0 :(得分:0)

您将两个参数传递给Array.prototype.reduce

const bifurcate = (arr, filter) => arr.reduce(
    // first argument
    (acc, val, i) => (acc[filter[i] ? 0 : 1].push(val), acc),
    // second argument
    [[], []]
);

带有花括号的正确版本为:

const bifurcate = (arr, filter) => arr.reduce(
    // first argument
    (acc, val, i) => {
        acc[filter[i] ? 0 : 1].push(val);
        return acc;
    },
    // second argument
    [[], []]
);