如果满足条件,则对字段值求和
sum field values if they meet conditions
我正在尝试对多个字段值求和,但前提是满足与这些字段值关联的条件。例如:
我有一个包含多个数值字段的 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 求和。如何按任意顺序对字段求和?
不知道我理解的对不对,但是如果你想要简洁,并且假设所有字段的值都是安全的(例如没有undefined),那么你可以使用
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]
首先,我不太清楚您为什么要为每个字段创建多个变量。这样的东西行得通吗?
var FLPTotal = 0;
然后,如果满足其中一个条件,您只需将值添加到它即可。
FLPTotal += this.getField(cTotal3).value;
如果它 returns 作为一个字符串你可以做。
FLPTotal += parseInt(this.getField(cTotal3).value);
以下将累加 cTotals 的所有值。
// 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;
告诉我这是否有效。
我正在尝试对多个字段值求和,但前提是满足与这些字段值关联的条件。例如:
我有一个包含多个数值字段的 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 求和。如何按任意顺序对字段求和?
不知道我理解的对不对,但是如果你想要简洁,并且假设所有字段的值都是安全的(例如没有undefined),那么你可以使用
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]
首先,我不太清楚您为什么要为每个字段创建多个变量。这样的东西行得通吗?
var FLPTotal = 0;
然后,如果满足其中一个条件,您只需将值添加到它即可。
FLPTotal += this.getField(cTotal3).value;
如果它 returns 作为一个字符串你可以做。
FLPTotal += parseInt(this.getField(cTotal3).value);
以下将累加 cTotals 的所有值。
// 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;
告诉我这是否有效。