所以我对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();
答案 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 last
和prev[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
建立新的last
新curr
(["CAR", "CAP", 268]
)
基本上,reduce函数中的第三次运行就像第一次reduce运行一样,除了我们正在建立一个新的last
来测试
编写此reduce函数的方式,您减少的数组必须已经预先排序。