微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您可以使用reduce 根据一系列数字是否递增来返回布尔值吗?

如何解决您可以使用reduce 根据一系列数字是否递增来返回布尔值吗?

因此,使用 for 循环编写函数来检查给定数字的数字是否递增 1 似乎相当简单。例如,传递数字 12345 应该返回 true。但是我很好奇是否可以通过将每个数字(假设您已经将数字分成一组数字)与前一个数字进行比较并返回布尔值来使用 reduce 来实现这一点?

解决方法

使用reduce,您可以检查当前数字是否比前一个数字多1。

为空数组设置初始值。我使用过 false,但更改为 true 不会影响非空数组。

第 1 项应始终返回 true,因为我们无法将其与任何其他数字进行核对。您检查的其余数字与前一个数字相交,并与累加器的前一个值 (acc) 相交:

const fn = num => String(num)
  .split('')
  .reduce((acc,c,i,arr) => !i || acc && +c - 1 === +arr[i-1],false)

console.log(fn(12345)) // true
console.log(fn(112345)) // false

更好的解决方案是使用将结束的 Array.every(),并在任何数字返回 false 时立即返回 false。如果所有数字都比前面的数字大 1,它只会返回 true

const fn = num => String(num)
  .split('')
  .every((c,arr) => !i || +c - 1 === +arr[i-1])

console.log(fn(12345)) // true
console.log(fn(112345)) // false

,

如果您想提前退出,还有array.some

const array = [1,2,3,4,5];
console.log(!array.some((element,index,arr) => index>0?(element-arr[index-1]) !== 1:false));
,

“老实说,伙计们, 为什么要这么麻烦?” 一个简单的循环只需要一次前进一位,就可以了一旦发现不匹配。 “减少”似乎是一个非常学术的问题。

,

如果您的输入是一个数字,并且它的数字应该以 1 递增,那么没有那么多解决方案:数字的字符串表示形式始终是 '0123456789' 的子字符串。这相当于 10+8+7+..+1 种可能性,即 46(注意 0 不能合并)。所以最简单的就是:

const isIncrementing = n => '0123456789'.includes(n);

// demo
console.log(isIncrementing(4567)); // true
console.log(isIncrementing(45567)); // false
console.log(isIncrementing(8901)); // false
console.log(isIncrementing(0)); // true

不需要使用 reduce,因为它在发现一对违反规则的数字时无法退出,但必须继续使用到最后。

仍然,如果需要使用reduce,那么当到目前为止所有数字都增加1时,我会让累积值代表前一个数字,否则将累积值设为-2。然后测试最终结果不是-2。

const isIncrementing = n => Array.from(String(n),Number)
                      .reduce((a,b) => a + 1 === b ? b : -2) >= 0; 

// demo
console.log(isIncrementing(4567)); // true
console.log(isIncrementing(45567)); // false
console.log(isIncrementing(8901)); // false
console.log(isIncrementing(0)); // true

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。