Javascript 计算未返回正确的值
有人能告诉我这个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
函数计算(){
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