var getOrdinal = function(n) {
var s = ["th", "st", "nd", "rd"],
v = n % 100;
return n + (s[(v - 20) % 10] || s[v] || s[0]);
};
console.log(getOrdinal(1));
答案 0 :(得分:1)
首先,数字1-10和20-30,30-40等遵循相同的模式。青少年不遵循这种模式 - 11日,12日,13日,14日等,直到20岁。
v被设置为n的余数除以100 - 换句话说,传入的数字n的最后两位数。这是因为每一百的序数结尾是相同的。
计算扩展时,or语句中有三个子句 - 第一个评估的子句 - 通过索引到数组中,其值介于0和3(含)之间 - 将附加到传递的原始数字上。 / p>
让我们打破每一个:
s [(v - 20)%10] - 这通过从数字中减去20然后在除以10之后找到余数来处理数字超过20的情况。例如32计算结果为2并返回'nd'。如果数字不以1,2或3结尾或小于20,则该条款将不予评估,我们将检查下一条款
s [v] - 通过直接索引到数组中来分别得到'th','st','nd'或'rd'来处理数字为0,1,2或3的情况< / p>
s [0] - 最后这会处理所有其他数字
关键是要注意两件事:
HTH
答案 1 :(得分:0)
var s = ["th", "st", "nd", "rd"],
声明一个名为s的数组,其中包含4个字符串。
v = n % 100;
并且,另一个名为v who的值的变量是传入参数(n)模数100(余数为n / 100)的结果
return n + (s[(v - 20) % 10] || s[v] || s[0]);
该函数应返回n +的计算值,以下第一个不计算为“falsy”值的数组元素(0,“”,undefined,null,false):v-20索引元素数组,数组的v索引元素或数组的第一个元素。
答案 2 :(得分:0)
可能会更好地修改代码
/
这将分别输出funky return语句的每个“部分” - 这样你就可以看到自己发生了什么