满足条件的字段值之和

时间:2018-06-19 16:29:49

标签: javascript pdf foxit

我试图求和多个字段值,但前提是要满足与这些字段值关联的条件。例如:

我有一个包含多个数字值字段的PDF表单。这些数字字段中的每一个都伴随着状态的选择。我只想添加相同状态的所有数字字段。这是我尝试并认为可以正常运行的代码,但似乎如果更改了先前添加的字段的状态,它将无法正常工作。例如,如果我添加Field1,Field2和Field4是因为它们的状态相同,但是我返回并将Field2的状态更改为其他状态,则它将停止工作:

// field names
var cTotal1 = "Day1Pd1Total";
var cTotal2 = "Day1Pd2Total";
var cTotal3 = "Day1Pd3Total";
var cTotal4 = "Day1Pd4Total";
var cTotal5 = "Day1Pd5Total";
var cTotal6 = "Day1Pd6Total";
var cStatus1 = "Day1Pd1Status";
var cStatus2 = "Day1Pd2Status";
var cStatus3 = "Day1Pd3Status";
var cStatus4 = "Day1Pd4Status";
var cStatus5 = "Day1Pd5Status";
var cStatus6 = "Day1Pd6Status";
// get conditonal field values
var vStatus1 = this.getField(cStatus1).value;
var vStatus2 = this.getField(cStatus2).value;
var vStatus3 = this.getField(cStatus3).value;
var vStatus4 = this.getField(cStatus4).value;
var vStatus5 = this.getField(cStatus5).value;
var vStatus6 = this.getField(cStatus6).value;
// get field values base on condition
if(vStatus1 == "1"){
var vTotal1 = this.getField(cTotal1).value;
}else{
var vTotal1 = "";
}
if(vStatus2 == "1"){
var vTotal2 = this.getField(cTotal2).value;
}else{
var vTotal2 = "";
}
if(vStatus3 == "1"){
var vTotal3 = this.getField(cTotal3).value;
}else{
var vTotal3 = "";
}
if(vStatus4 == "1"){
var vTotal4 = this.getField(cTotal4).value;
}else{
var vTotal4 = "";
}
if(vStatus5 == "1"){
var vTotal5 = this.getField(cTotal5).value;
}else{
var vTotal5 = "";
}
if(vStatus6 == "1"){
var vTotal6 = this.getField(cTotal6).value;
}else{
var vTotal6 = "";
} 
// clear result value
event.value = "";
// add values
var FLPTotal = vTotal1 + vTotal2 + vTotal3 + vTotal4 + vTotal5 + vTotal6;
event.value = FLPTotal;

当发生更改时,如何重新计算此脚本?这也在PDF文件中。

编辑:进一步的测试表明,运行顺序似乎是问题所在。 vTotal1将成功添加到vTotal2,然后添加到vTotal3,只要它们以该顺序填充。 vTotal1不会与vTotal3相加。如何以任何顺序汇总字段?

2 个答案:

答案 0 :(得分:1)

首先,我不太确定为什么要为每个字段创建多个变量。这样的东西行吗?

var FLPTotal = 0;

然后,如果满足条件之一,则只需将值添加到其中。

FLPTotal += this.getField(cTotal3).value;

如果它以字符串形式返回,则可以。

FLPTotal += parseInt(this.getField(cTotal3).value);

以下内容将汇总cTotal的所有值。

// field names
var cTotal1 = "Day1Pd1Total";
var cTotal2 = "Day1Pd2Total";
var cTotal3 = "Day1Pd3Total";
var cTotal4 = "Day1Pd4Total";
var cTotal5 = "Day1Pd5Total";
var cTotal6 = "Day1Pd6Total";
var cStatus1 = "Day1Pd1Status";
var cStatus2 = "Day1Pd2Status";
var cStatus3 = "Day1Pd3Status";
var cStatus4 = "Day1Pd4Status";
var cStatus5 = "Day1Pd5Status";
var cStatus6 = "Day1Pd6Status";
// get conditional field values
var vStatus1 = this.getField(cStatus1).value;
var vStatus2 = this.getField(cStatus2).value;
var vStatus3 = this.getField(cStatus3).value;
var vStatus4 = this.getField(cStatus4).value;
var vStatus5 = this.getField(cStatus5).value;
var vStatus6 = this.getField(cStatus6).value;
// Add total variable
var FLPTotal = 0;
// get field values base on condition
if(vStatus1 == "1"){
FLPTotal += parseInt(this.getField(cTotal1).value);
}
if(vStatus2 == "1"){
FLPTotal += parseInt(this.getField(cTotal2).value);
}
if(vStatus3 == "1"){
FLPTotal += parseInt(this.getField(cTotal3).value);
}
if(vStatus4 == "1"){
FLPTotal += parseInt(this.getField(cTotal4).value);
}
if(vStatus5 == "1"){
FLPTotal += parseInt(this.getField(cTotal5).value);
}
if(vStatus6 == "1"){
FLPTotal += parseInt(this.getField(cTotal6).value);
}
// clear result value and set result value
event.value = "";
event.value = FLPTotal;

告诉我这是否可行。

答案 1 :(得分:0)

不确定我是否理解正确,但是如果您希望它简洁明了,并假设所有字段的值都是安全的(例如,没有未定义),则可以使用

    Object.values(some object)

使字段的值成为数组。然后它将是两个数组的内积:一个来自“ vStatus”部分的切片,另一个来自“ cTotal”部分。

Math.js可能是有效的外部库,可以简洁地解析内部产品。

Example of Object.values lies here (MDN)

    const object1 = {
      a: 'somestring',
      b: 42,
      c: false
    };

    console.log(Object.values(object1));
    // expected output: Array ["somestring", 42, false]