【问题标题】:Javascript .reduce Boolean Unexpected ReturnJavascript .reduce 布尔意外返回
【发布时间】:2019-08-08 18:11:01
【问题描述】:

尝试创建一个函数来检查一个大数字(即每个数字都小于或等于其右侧的数字,例如 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)。

它适用于许多其他测试,但不是这个值。不应该减少测试每一对并返回真/假吗?如果有一个错误,它应该返回错误,对吗?我是否错误地使用了 reduce?是否可以使用另一个函数来简化此测试而不是编写循环?

【问题讨论】:

  • 01223047337447 作为整数,您需要将 n 作为字符串并将它们解析为 reduce 函数中的 int
  • 还有:你的牙套有点怪...
  • readline 解析字符串然后反复将其转换回字符串似乎很奇怪...如果您的示例中有一个前导,那就特别奇怪数字“0”,因为这样做会删除前导数字。

标签: javascript arrays reduce shorthand


【解决方案1】:

请记住,对于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]。)

【讨论】:

  • 打败我! :D
  • 有趣的是,还有另一种方法可以从组合的角度来看待这个问题。这些数字有多少种组合,其中每个数字都大于或等于其左侧的数字?只有1种可能的组合!这意味着我们基本上是在检查排序顺序:
  • ``` const isTall = n => { const arr = (''+n).split('');返回 arr === arr.sort(); } ```
  • @JamieDixon - :-) 非常正确。 (您需要将这些数组转换回字符串以进行=== 检查。)
  • 是的!这也提醒了我sort 是变异的。我确实想知道为什么 ['b', 'a'] === ['a', 'b'] 总是返回 true :)
猜你喜欢
  • 2022-01-10
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多