试图创建一个函数来检查一个大数字(即,每个数字都小于或等于其右边的数字,例如123、059等)。
以下代码是问题所在:
const n = parseInt(readline());
if (n.toString().length === 1)
console.log('true');
else
{
var z = n.toString().split('');
console.log(z.reduce((a, b) => b > a));
}
此测试失败:01223047(应返回false时返回true)。
它在许多其他测试中都起作用,但是没有这个值。难道不应该减少测试每一对并返回true / false吗?如果有一个假,它应该返回假,对吗?我使用reduce不正确吗?我可以使用另一个功能来简化此测试而不是编写循环吗?
答案 0 :(得分:5)
请记住,使用reduce
时,提供给回调的第一个参数是上次调用回调的返回值。 (在第一次调用中,如果您没有提供种子值-并且没有提供-第一个值将是数组中的第一个条目。)
不,reduce
不会测试每一对。它会测试第一对,然后针对上一个回调的返回标志(分别)测试其余值。
对于您正在做的事情,您可能想要一个简单的循环,或者some
或every
(可能是every
)。对于some
和every
,您将使用提供的索引作为回调的第二个参数来获取下一个(或上一个)字符。使用every
还将消除单字符字符串的特殊情况:
function test(str, expect) {
const z = str.split(""); // I'd probably use `= Array.from(str);` on ES2015+
const result = z.every((ch, i) => i === 0 || ch > z[i - 1]);
console.log(str, result, !result === !expect ? "Good" : "ERRROR");
}
test("123", true);
test("1", true);
test("21", false);
(使用localCompare
可能是一个论点,因为它是ch.localeCompare(z[i - 1]) > 0
而不是ch > z[i - 1]
。)