需要帮助了解删除数组中重复项的功能并汇总值

时间:2017-05-17 05:43:15

标签: javascript if-statement reduce

所以我对Javascript很新,当我遇到一个要求我采用多维数组并在总结其值时组合重复项目的练习时,我正在完成FCC课程。

在网上搜索之后(尽管仍然是Stackoverflow),我遇到了下面的代码片段,完成了这一点。唯一的问题是当逻辑评估“true”时,我不完全理解嵌套的“if”语句中发生了什么。

我理解代码的所有其他部分都很好,但if语句只是让我失望。

无论如何,如果有人能花时间向我解释那句话,特别是当条件逻辑返回true时,我将非常感激。

我希望这个问题有道理,而且不是重复。如果是,我将非常感谢现有答案的任何链接。

谢谢!

function myFunc(){

var source = [
    ["CAR", "CAH", 394],
    ["CAR", "CAH", 96],
    ["CAR", "CAP", 268],
    ["DOR", "CAF", 71],
    ["DOR", "CAP", 96],
    ["DOR", "CAP", 268],
    ["VAC", "GILAB", 71]
];

var last;
var folded = source.reduce(function(prev,curr, index){

    if (last) {
        if (last[0] === curr[0] && last[1] === curr[1]) {
            last[2] += curr[2];               
            return prev;
        }
    }
    last = curr;
    prev.push(curr);

    return prev;
},[]);


};

myFunc();

1 个答案:

答案 0 :(得分:0)

第一次在reduce函数内运行,初始状态为:

prev = []
current = ["CAR", "CAH", 394]
last = undefined
  • last未定义,因此我们跳过整个if语句
  • last现在是对curr
  • 的引用
  • 然后我们将curr推送到prev,最初为空: [].push(["CAR", "CAH", 394])

第二次在reduce函数内运行,初始状态为:

  prev = [["CAR", "CAH", 394]]
  current = ["CAR", "CAH", 96]
  last = ["CAR", "CAH", 394]
  • 回想一下,last实际上是对之前 curr的引用, 现在已被推到了prev的第0个元素。 您可以通过执行以下操作来确认:last === prev[0],它应评估为真

  • 我们现在测试last[0] === curr[0] && last[1] === curr[1],即"CAR" === "CAR" && "CAH" === "CAH"。这评估为真

  • 评估的
  • last[2] += curr[2]394 += 96,即490
  • 由于lastprev[0]通过引用链接在一起,我们在更改prev[0]时也会更改last
  • prev现在是[["CAR", "CAH", 490]]
  • 然后我们在这里点击了return prev,它跳过了reduce块的其余部分。

第三次在reduce函数内运行,初始状态为:

  prev = [["CAR", "CAH", 490]]
  current = ["CAR", "CAP", 268]
  last = ["CAR", "CAH", 490]
  • 这一次,测试last[0] === curr[0] && last[1] === curr[1]变为false,因为:"CAR" === "CAR" && "CAH" === "CAP"
  • 因此,我们通过引用last建立新的lastcurr["CAR", "CAP", 268]

    基本上,reduce函数中的第三次运行就像第一次reduce运行一样,除了我们正在建立一个新的last来测试

编写此reduce函数的方式,您减少的数组必须已经预先排序。