使用一行if语句进行归约和展开函数的逻辑

时间:2019-04-18 18:04:27

标签: javascript spread-syntax

我在理解此reduce示例的if语句时遇到问题:

SimpleInit

我试图理解伪代码中的if语句,阅读此示例后,我会继续看到以下内容:

const colors = ['red', 'red', 'green', 'blue', 'green', 'yellow'];
console.log(colors);

const distinctColors = colors.reduce(
    (distinct, color) =>
        (distinct.indexOf(color) !== -1) ? 
            distinct : 
            [...distinct, color], []
)

console.log(distinctColors)

我要关闭还是要离开?

测试版本here

2 个答案:

答案 0 :(得分:1)

试图用注释进行解释,希望能有所帮助。

const colors = ['red', 'red', 'green', 'blue', 'green', 'yellow'];
console.log(colors);

const distinctColors = colors.reduce(
    (distinct, color) =>
        (distinct.indexOf(color) !== -1) ? 
        // ----------------^ Turnary to test for presence of current color in the accum []
            distinct : 
        // ----^ It DOES exist, so return the current Accum array    
            [...distinct, color], []
            // ---^ Is DOES NOT exist, return a new array of Accum + Color
            // --------------------^ This initialises a new empty array into the accumulator
)

console.log(distinctColors)

只需添加此内容以供参考,为此使用一个集要有效得多。

const colors = ['red', 'red', 'green', 'blue', 'green', 'yellow'];
console.log(colors);

const distinctColors = [...new Set(colors)];

console.log(distinctColors)

这是Set上的MDN文档。 Javascript Set

答案 1 :(得分:0)

它将数组减小为唯一值。您可以将其读取为:

distinct设置为一个空数组(要减少的第二个参数)。对于color中的每个colors,如果colordistinct(索引为== -1)中,请将distinct更新为distinct( no-op)(第一三进制分支),否则,如果color不在distinct中,则将distinct更新为distinct + color(第二三进制分支)。

请参阅mdn reduce文档。