Javascript 计算未返回正确的值

Javascript 计算未返回正确的值,javascript,html,Javascript,Html,有人能告诉我这个javascript代码的错误是什么吗 节目: 函数计算(){ var fieldscocontainer=document.getElementsByClassName(“trabalho”)[0]。 getElementsByClassName(“行”), 我 作业字段=[], 伦恩, newAge=0, selfGender=document.aposentadoria.sexo.value, 工作日=0, 工作月数=0, 工作年限=0; len=字段Container.l

有人能告诉我这个javascript代码的错误是什么吗

节目:

函数计算(){
var fieldscocontainer=document.getElementsByClassName(“trabalho”)[0]。
getElementsByClassName(“行”),
我
作业字段=[],
伦恩,
newAge=0,
selfGender=document.aposentadoria.sexo.value,
工作日=0,
工作月数=0,
工作年限=0;
len=字段Container.length;
对于(i=0;len>i;i++){
工作领域[i]={
录取日期:新日期(fieldsContainer[i].getElementsByClassName(“录取区域”)[0]。children[1]。value),//数据录取Ão,
AgRule:fieldsContainer[i]。GetElementsByCassName(“regra区域”)[0]。子项[0]。值,//regra
demissionDate:new Date(fieldsContainer[i].GetElementsByCassName(“demissao区域”)[0]。children[1]。value),//数据删除(o)
jobBusiness:fieldsContainer[i]。getElementsByClassName(“empresa区域”)[0]。儿童[1]。值//empresa do trabalho
};
if(作业字段[i].离职日期>作业字段[i].离职日期){
jobFields[i].workedYears=jobFields[i].demissionDate.getFullYear()-jobFields[i].admissionDate.getFullYear();
jobFields[i].workedMonthies=jobFields[i].demissionDate.getMonth()-jobFields[i].admissionDate.getMonth();
jobFields[i].workedDays=jobFields[i].demissionDate.getDate()-jobFields[i].admissionDate.getDate();
警报(作业字段[i]。工作年数)
}否则{
警报(“数据发布者”或“数据发布者”);
抛出新错误(“Conversor::准入日期必须早于离职日期。”)
}
}
var fieldsRule=[];
len=jobFields.length;
对于(i=0;len>i;i++){
fieldsRule[i]=jobFields[i]。Agrule
}
var calculateFields=[],
higherRule=Math.max.apply(fieldsRule)
len=jobFields.length;
对于(i=0;len>i;i++){
if(字段规则[i]==高位规则){
计算字段[i]=i
}
}
最后,
过去的几年,
jobYearsEnd;
len=计算字段长度;
如果(自我性别==“M”){
对于(i=0;len>i;i++){
最后的=
作业字段[calculateFields[i]]。Agule==“25”?1.40:
作业字段[calculateFields[i]]。Agule==“20”?1.75:
作业字段[calculateFields[i]]。Agule==“15”?2.33:
1.75;
newAge=jobFields[calculateFields[i]]。工作年限*管理倍数;
失踪年数=新生年数-35
}
}否则{
对于(i=0;len>i;i++){
最后的=
作业字段[calculateFields[i]]。Agule==“25”?1.20:
作业字段[calculateFields[i]]。Agule==“20”?1.50:
作业字段[calculateFields[i]]。Agule==“15”?2:
1.20;
newAge=jobFields[calculateFields[i]]。工作年限*管理倍数;
失踪年数=新年龄-30
}
}
警报(丢失年份)
如果(缺失年数<0){
jobYearsEnd=missingYears*-1;
}
document.getElementById(“anosTrabalhados”).innerHTML=workedYears+“anos”;
document.getElementById(“结果”).innerHTML=“”+“Vocêtrabalhou”+工作年数+“anos”,“工作月数+“meses e”+工作日数+“dias”+“
”+“Faltam”+jobYearsEnd+“anos para se aposentar” }
[如果解释得不好,请告诉我。我英语说得不太好]

我需要得到许可日期和解除许可日期的值,然后减去每一行,包括用户添加的值。然后,我需要得到规则的最大值是相等的,并将每个规则的工作时间相加。然后,该程序将工作时间相加,乘以每个规则的值,并减去35(男性)和30(女性)。然后显示上次计算的值(减去30或35)

代码哪里错了


通过查看源代码查看代码

我已经尽了我所能处理了这一部分,因为存在一些挑战和一些问题,我不能100%确定您的意图。我相信你可以在这里工作。当你处理多个相关的日期时,日期是很难的。如果边界跨越夏令时等等,为了帮助我使用一个日期库,请随意获取另一个或使用它,我将其粘贴到fiddle代码中;使用它或者找另一个做这些事情的人,而不是重新发明一个。我没有广泛使用它

这里有一把保存好的小提琴来测试/试用:(好的部分见底部)

链接日期库:

说明: 首先,您未公开的代码复制一个ID,这些ID必须是唯一的,当您使用该ID时,它是错误的。我通过使用jQuery
.clone()
修复了这个问题,我还提供了一个方法,可以从列表中添加/删除页面上缺少的行(除了最后一行之外的所有行)

代码剪报:

document.getElementById("anosTrabalhados").innerHTML
jobFields[i]={
    admissionDate:new Date(fieldsContainer[i].getElementsByClassName("admissao-area")[0].children[1].value),//data de admissão,
if (jobFields[i].demissionDate > jobFields[i].admissionDate) {
var calcVals = {
  rules: {
    male: {
      sex: "M",
      defaultRate: 1.75,
      ageVar: 35,
      ageRules: [{
        age: "25",
        val: 1.40
      }, {
        age: "20",
        val: 1.75
      }, {
        age: "15",
        val: 2.33
      }]
    },
    female: {
      sex: "M",
      defaultRate: 1.50,
      ageVar: 30,
      ageRules: [{
        age: "25",
        val: 1.20
      }, {
        age: "20",
        val: 1.50
      }, {
        age: "15",
        val: 2.00
      }]
    }
  }
};
fieldsRule[i]=jobFields[i].ageRule
我将向您展示如何修复该问题(请参阅标记和
.clone()

  • 您有一些相当复杂的选择器,可以通过使用类来简化这些选择器
代码剪报:

document.getElementById("anosTrabalhados").innerHTML
jobFields[i]={
    admissionDate:new Date(fieldsContainer[i].getElementsByClassName("admissao-area")[0].children[1].value),//data de admissão,
if (jobFields[i].demissionDate > jobFields[i].admissionDate) {
var calcVals = {
  rules: {
    male: {
      sex: "M",
      defaultRate: 1.75,
      ageVar: 35,
      ageRules: [{
        age: "25",
        val: 1.40
      }, {
        age: "20",
        val: 1.75
      }, {
        age: "15",
        val: 2.33
      }]
    },
    female: {
      sex: "M",
      defaultRate: 1.50,
      ageVar: 30,
      ageRules: [{
        age: "25",
        val: 1.20
      }, {
        age: "20",
        val: 1.50
      }, {
        age: "15",
        val: 2.00
      }]
    }
  }
};
fieldsRule[i]=jobFields[i].ageRule
修订:

var thisRow = fieldsContainer[i];
jobFields[i] = {
  admissionDate: new Date(thisRow.getElementsByClassName("dataAdmissao")[0].value),
    在循环中间的日期检查/验证,也许你可以在循环之前检查这些数据?我暂时没有改变它的原样
代码剪报:

document.getElementById("anosTrabalhados").innerHTML
jobFields[i]={
    admissionDate:new Date(fieldsContainer[i].getElementsByClassName("admissao-area")[0].children[1].value),//data de admissão,
if (jobFields[i].demissionDate > jobFields[i].admissionDate) {
var calcVals = {
  rules: {
    male: {
      sex: "M",
      defaultRate: 1.75,
      ageVar: 35,
      ageRules: [{
        age: "25",
        val: 1.40
      }, {
        age: "20",
        val: 1.75
      }, {
        age: "15",
        val: 2.33
      }]
    },
    female: {
      sex: "M",
      defaultRate: 1.50,
      ageVar: 30,
      ageRules: [{
        age: "25",
        val: 1.20
      }, {
        age: "20",
        val: 1.50
      }, {
        age: "15",
        val: 2.00
      }]
    }
  }
};
fieldsRule[i]=jobFields[i].ageRule
这似乎是一个语法问题:

higherRule=Math.max.apply(fieldsRule) //old
higherRule=Math.max.apply(null, fieldsRule); //repaired
参考:

  • 从代码中删除常量并将其放入对象中:
代码剪报:

document.getElementById("anosTrabalhados").innerHTML
jobFields[i]={
    admissionDate:new Date(fieldsContainer[i].getElementsByClassName("admissao-area")[0].children[1].value),//data de admissão,
if (jobFields[i].demissionDate > jobFields[i].admissionDate) {
var calcVals = {
  rules: {
    male: {
      sex: "M",
      defaultRate: 1.75,
      ageVar: 35,
      ageRules: [{
        age: "25",
        val: 1.40
      }, {
        age: "20",
        val: 1.75
      }, {
        age: "15",
        val: 2.33
      }]
    },
    female: {
      sex: "M",
      defaultRate: 1.50,
      ageVar: 30,
      ageRules: [{
        age: "25",
        val: 1.20
      }, {
        age: "20",
        val: 1.50
      }, {
        age: "15",
        val: 2.00
      }]
    }
  }
};
fieldsRule[i]=jobFields[i].ageRule
然后在以后使用它:(这将消除重复的硬编码条件,使其更简单、更易于维护)

这改变了这种比较:(请参见下一个代码段)

fieldsRule[i]
是一个字符串,
higherRule
是一个数字(请参见上面的
Math.max.apply

您可以基于
jobFields
设置迭代变量
len
,但可以访问可能未定义的
fieldsRule[i]
。您的意思是推送到数组而不是分配给它吗?我这样问是因为后来你使用了
len=calculateFields.length作为迭代值。请注意,所有
字段规则[i]
可能都不是eval