Javascript 为什么S函数中的第一个for循环在下面的node js程序中无限运行?
请检查以下代码,并解释当我在输入中多次提供相同的9位电话号码时,为什么for循环无限运行。 我正在更改嵌套for循环中的numberData的内容,但这不应该是一个问题,并且在numberData中嵌套for循环之后会推送元素,因此我很困惑为什么会发生这种情况,有人能解释一下:Javascript 为什么S函数中的第一个for循环在下面的node js程序中无限运行?,javascript,node.js,Javascript,Node.js,请检查以下代码,并解释当我在输入中多次提供相同的9位电话号码时,为什么for循环无限运行。 我正在更改嵌套for循环中的numberData的内容,但这不应该是一个问题,并且在numberData中嵌套for循环之后会推送元素,因此我很困惑为什么会发生这种情况,有人能解释一下: var str = "00:01:07,400-234-090\n00:05:01,701-080-080\n00:05:00,400-234-090\n00:01:06,701-080-080\n00:01:0
var str = "00:01:07,400-234-090\n00:05:01,701-080-080\n00:05:00,400-234-090\n00:01:06,701-080-080\n00:01:06,701-080-000"
console.log(solution(str))
function solution(S) {
var totalCost = 0
var lineArray = S.split('\n')
var numberData = []
/*{
number = 0,
duration = 0,
cost = 0
}*/
console.log(lineArray)
for (var i = 0; i < lineArray.length; i++) {
console.log(lineArray.length, i);
var dataArray = lineArray[i].split(',')
var number = dataArray[1]
var duration = dataArray[0]
var timeArray = duration.split(':')
var hours = +(timeArray[0])
var min = +(timeArray[1])
var sec = +(timeArray[2])
var numberPresent = false
var totalDuration = hours * 60 * 60 + min * 60 + sec //in Seconds
var cost = 0;
if (min < 5) {
cost = min * 60 + sec
} else {
if (sec == 0)
cost = min * 150
else
cost = (min + 1) * 150
}
for (var i = 0; i < numberData.length; i++) {
if (numberData[i].number == number) {
numberData[i].duration += totalDuration
numberData[i].cost += cost
numberPresent = true
}
}
if (!numberPresent)
numberData.push({
number: number,
duration: totalDuration,
cost: cost
})
}
var maxDurationIndex = 0
totalCost += numberData[0].cost
for (var i = 1; i < numberData.length; i++) {
if (numberData[i].duration > numberData[maxDurationIndex])
maxDurationIndex = i;
if (numberData[i].duration == numberData[maxDurationIndex]) {
var currentNumericNumber = getNumericNumber(numberData[i])
var maxIndexNumber = getNumericNumber(numberData[maxDurationIndex])
if (currentNumericNumber > maxIndexNumber)
maxDurationIndex = i;
}
totalCost += numberData[i].cost
}
totalCost = totalCost - (+numberData[maxDurationIndex].cost)
return totalCost
function getNumericNumber(numberString) {
var numberArray = numberString.split('-')
var string = '';
for (var i = 0; i < numberArray.length; i++) {
string += numberArray[i];
}
return +string;
}
}
var str=“00:01:07400-234-090\n00:05:01701-080-080\n00:05:00400-234-090\n00:01:06701-080-080\n00:01:06701-080-000”
console.log(解决方案(str))
功能解决方案{
var totalCost=0
var lineArray=S.split('\n')
变量numberData=[]
/*{
数字=0,
持续时间=0,
成本=0
}*/
console.log(线性阵列)
对于(变量i=0;inumberData[maxDurationIndex])
maxDurationIndex=i;
if(numberData[i].duration==numberData[maxDurationIndex]){
var currentNumericNumber=getNumericNumber(numberData[i])
var maxIndexNumber=getNumericNumber(numberData[maxDurationIndex])
如果(currentNumericNumber>maxIndexNumber)
maxDurationIndex=i;
}
总成本+=numberData[i]。成本
}
totalCost=totalCost-(+numberData[maxDurationIndex].cost)
返回总成本
函数getNumericNumber(numberString){
var numberraray=numberString.split(“-”)
var字符串=“”;
对于(变量i=0;i
您可以通过在输入中提供不同的电话号码来测试它,然后它就可以正常工作。您的内循环在外循环的每次迭代中将
i
的值重置为numberData.length
。对numberData
上的内环使用不同的变量,如j
for(var j=0; j<numberData.length; j++)
{
if(numberData[j].number == number)
{
numberData[j].duration+= totalDuration
numberData[j].cost +=cost
numberPresent = true
}
}
没有过滤和映射的意义,而仅仅是标记长度。否则,您将如何增加那些数字与number属性中的值相同的值的持续时间和成本?您能否解释为什么自“i”之后,内部循环将i的值重置为numberData.length内循环的作用域位于该循环本身的内部,而外循环“i”对于内循环来说是全局的,因此它改变了外循环的“i”值,var的作用域是封闭函数,而不是块。
numberPresent = numberData.filter( s => s.number == number ).map( s => {
s.duration += totalDuration;
s.cost += cost;
return s;
}).length > 0