Uncaught TypeError: Reduce of empty array with no initial value
Uncaught TypeError: Reduce of empty array with no initial value
我正在尝试设计这个非常简单的应用程序,您在其中输入 2 个数字,该应用程序将计算 2 个输入数字之间所有数字的较小公倍数。
函数本身运行良好(从控制台的结果来看);但是,当我尝试使用事件侦听器 link 到 HTML 时,会出现故障。因此,我假设我在 link 到 HTML 时犯了一些错误。
对于某些数字,我的应用程序运行良好,但对于某些数字,出于某种原因,它不起作用(例如,输入 2 和 10、7 和 11...等)。错误说:
Uncaught TypeError: Reduce of empty array with no initial value
这是我的代码。
const smallNum = document.querySelector('#smallernum')
const bigNum = document.querySelector('#biggernum')
const button = document.querySelector('button')
const result = document.querySelector('#result')
button.addEventListener('click', () => {
result.value = smallestCommons([smallNum.value, bigNum.value])
})
function smallestCommons(arr) {
arr.sort((a,b) => a-b)
let lowerNum = arr[0]
let higherNum = arr[1]
let newArr = []
let primeOfArr = []
let shortDivisionArr = [];
// Create an array of nums inbetween the two extreme nums
for(let i = lowerNum; i <= higherNum; i++) {
newArr.push(i)
}
// Create an array of primes up until largest num
for(let i = 1; i <= higherNum; i++) {
let flag = 0;
for(let j = 2; j < i; j++) {
if(i % j === 0) {
flag = 1;
break;
}
}
if(i > 1 && flag === 0) {
primeOfArr.push(i)
}
}
// Short Division
for(let i = 0; i < primeOfArr.length; i++) {
while(newArr.some((num) => num % primeOfArr[i] === 0)) {
for(let j = 0; j < newArr.length; j++) {
if(newArr[j] % primeOfArr[i] === 0) {
newArr[j] = newArr[j] / primeOfArr[i]
}
} shortDivisionArr.push(primeOfArr[i])
}
}
return shortDivisionArr.reduce((a,b) => a*b);
}
<div class="container">
<div id="main">
<div class="title">
<h2>This App Helps You Find The Smallest Common Multiple Of Consecutive Numbers Between 2 Nums!</h3>
<p>2 nums inclusive. App for demonstration purpose. Please don't use this to cheat on your homework!</p>
</div>
<div class="calcs">
<div class="inputnums">
<input id="smallernum" type="text" placeholder="Enter a smaller num">
<input id="biggernum" type="text" placeholder="Enter a bigger num">
</div>
<button>Click to calculate!</button>
<input id="result" type="text" placeholder="Result is here!">
</div>
</div>
</div>
我做错了什么,我该如何解决?
问题已解决。
传递给函数的值(smallNum.value 和 bigNum.value)是字符串。
使用 parseInt() 将它们转换为整数,现在可以使用了。
我正在尝试设计这个非常简单的应用程序,您在其中输入 2 个数字,该应用程序将计算 2 个输入数字之间所有数字的较小公倍数。
函数本身运行良好(从控制台的结果来看);但是,当我尝试使用事件侦听器 link 到 HTML 时,会出现故障。因此,我假设我在 link 到 HTML 时犯了一些错误。
对于某些数字,我的应用程序运行良好,但对于某些数字,出于某种原因,它不起作用(例如,输入 2 和 10、7 和 11...等)。错误说:
Uncaught TypeError: Reduce of empty array with no initial value
这是我的代码。
const smallNum = document.querySelector('#smallernum')
const bigNum = document.querySelector('#biggernum')
const button = document.querySelector('button')
const result = document.querySelector('#result')
button.addEventListener('click', () => {
result.value = smallestCommons([smallNum.value, bigNum.value])
})
function smallestCommons(arr) {
arr.sort((a,b) => a-b)
let lowerNum = arr[0]
let higherNum = arr[1]
let newArr = []
let primeOfArr = []
let shortDivisionArr = [];
// Create an array of nums inbetween the two extreme nums
for(let i = lowerNum; i <= higherNum; i++) {
newArr.push(i)
}
// Create an array of primes up until largest num
for(let i = 1; i <= higherNum; i++) {
let flag = 0;
for(let j = 2; j < i; j++) {
if(i % j === 0) {
flag = 1;
break;
}
}
if(i > 1 && flag === 0) {
primeOfArr.push(i)
}
}
// Short Division
for(let i = 0; i < primeOfArr.length; i++) {
while(newArr.some((num) => num % primeOfArr[i] === 0)) {
for(let j = 0; j < newArr.length; j++) {
if(newArr[j] % primeOfArr[i] === 0) {
newArr[j] = newArr[j] / primeOfArr[i]
}
} shortDivisionArr.push(primeOfArr[i])
}
}
return shortDivisionArr.reduce((a,b) => a*b);
}
<div class="container">
<div id="main">
<div class="title">
<h2>This App Helps You Find The Smallest Common Multiple Of Consecutive Numbers Between 2 Nums!</h3>
<p>2 nums inclusive. App for demonstration purpose. Please don't use this to cheat on your homework!</p>
</div>
<div class="calcs">
<div class="inputnums">
<input id="smallernum" type="text" placeholder="Enter a smaller num">
<input id="biggernum" type="text" placeholder="Enter a bigger num">
</div>
<button>Click to calculate!</button>
<input id="result" type="text" placeholder="Result is here!">
</div>
</div>
</div>
我做错了什么,我该如何解决?
问题已解决。 传递给函数的值(smallNum.value 和 bigNum.value)是字符串。 使用 parseInt() 将它们转换为整数,现在可以使用了。