Javascript .reduce布尔意外返回

问题描述 投票:0回答:1

试图创建一个检查高数字的函数(即每个数字小于或等于其右边的数字,例如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?如果有一个假,它应该返回false,对吗?我使用reduce不正确吗?有没有其他功能我可以用来速记这个测试而不是写一个循环?

javascript arrays reduce shorthand
1个回答
5
投票

请记住,使用reduce时,提供给回调的第一个参数是前一次回调调用的返回值。 (在第一次调用中,如果您没有提供种子值 - 而您还没有 - 第一个值将是数组中的第一个条目。)

所以不,reduce没有测试每一对。它测试第一对,然后它针对前一个回调的返回标志测试其余的值(单独)。

对于你正在做的事情,你可能想要一个简单的循环,或some,或every(可能是every)。使用someevery,您将使用作为回调的第二个参数提供的索引来获取下一个(或上一个)字符。使用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]。)

© www.soinside.com 2019 - 2024. All rights reserved.