我正致力于题为SecondGreatLow的coderbyte挑战。我们得到一个数字数组作为参数,并且应该返回给定数组的第二低#和第二高#。
我正在使用别人的代码 - 我正在分析/逆向工程,但我在一方面感到困惑。这是代码:
function SecondGreatLow(arr) {
var unique = [arr[0]];
for(var i = 1; i < arr.length; i++) {
if (unique.indexOf(arr[i]) == -1) {
unique.push(arr[i]);
}
}
unique.sort(function(a,b){return a - b});
var smallest = unique[1].toString();
unique.reverse();
var largest = unique[1].toString();
return smallest + " " + largest;
}
我对代码的前半部分有困难 - 特别是indexOf语句。
通过阅读b / w行和查看代码的下半部分,我相信代码的第一个上半部分是摆脱所有重复值? - 所有剩余的非重复值都会弹出到唯一数组中,然后我们得到第二低(唯一[1])和第二高(反转数组中唯一[1])值。
但if-statement做什么???
我知道如果indexOf == -1,那么这意味着找不到找到的特定项目。
但是,如果我们一步一步地去......
var unique = [arr[0]];
^这是取给定数组/参数中第一个元素的值并将其存储在名为“unique”的数组中
然后有一个从索引1开始的for循环(而不是0)
for(var i = 1; i < arr.length; i++) {
^因此,for循环正在运行作为参数提供的原始数组(而不是通过唯一数组)。但这是我感到困惑的地方 -
if (unique.indexOf(arr[i]) == -1) {
unique.push(arr[i]);
所以我们假设我们要通过for循环的第一次迭代并且i = 1 ...我们想要找到arr [1]的索引,这将是数组的第二个值。但是哪个阵列? indexOf方法正在“唯一”运行,所以我们找到唯一数组的第二个值的索引(目前只有(arr [0])???或者我们找到第二个值的索引作为参数传入的数组?
第一次运行的唯一数组中没有第二个元素/值通过for循环(因为只有1个值),所以我们将推送该元素/将该元素添加到唯一数组中。
基本上,我很困惑代码的上半部分实际上在做什么。任何帮助,将不胜感激。
如果你想使用一个例子,我想,假设数组[7,7,12,98,106]作为参数传递......
提前致谢...
答案 0 :(得分:1)
如果唯一数组不包含与arr [i]匹配的值,请将其添加到唯一数组中。
循环从i = 1开始的原因是因为arr [0]已经存储在唯一中。我们迭代arr
,并检查唯一,并在值不存在时添加到唯一。
至于你的例子,我已经拿走了片段并添加了一些日志记录。这些是for循环每次传递后的结果:
getUniques([7, 7, 12, 98, 106])
["start with 7", "7"]
["try 7", "7"]
["try 12", "7,12"]
["try 98", "7,12,98"]
["try 106", "7,12,98,106"]
RESULT: [7, 12, 98, 106]
答案 1 :(得分:0)
for(var i = 1; i < arr.length; i++) {
if (unique.indexOf(arr[i]) == -1) {
unique.push(arr[i]);
}
}
此代码循环遍历从索引1开始的数组长度 - 不是0.不需要从0开始,因为我们可以假设第一项是唯一的
unique.indexOf
正在检查数组元素是否存在于unique
数组中。如果indexOf返回-1,则表示该元素不存在唯一,因此push
表示数组,否则,for循环将递增到数组中的下一个项