如何通过索引覆盖JavaScript对象的属性值?
问题根因
你的代码中jobPayment对象的属性是自定义字符串键(date/amount/method/reference),并非数组式的数字索引,直接用表单元素循环的数字下标idx作为键访问对象属性,无法匹配到你预设的属性,所以赋值失效。
实现方案
方案1:按表单元素顺序匹配属性(适配现有代码结构)
提前把jobPayment的属性名按页面里表单元素的排列顺序存入数组,循环时通过下标取到对应属性名再赋值即可,注意amount是数值类型,建议做类型转换避免存为字符串:
GetAllData: function(){ var jobPayments = $("#table1 tbody tr"); var jobPaymentsModels = []; // 按页面中input/select的排列顺序定义属性名数组 var paymentKeys = ["date", "amount", "method", "reference"]; jobPayments.each(function (idx, vl) { var jobPayment = {date:"",amount:0.0,method:"", reference:""}; $(this).find("td input,select").each(function (idx, vl) { // 用索引取对应的属性名 var key = paymentKeys[idx]; // amount字段单独转数值类型 jobPayment[key] = key === "amount" ? parseFloat(vl.value) || 0.0 : vl.value; }); jobPaymentsModels.push(jobPayment); }); return jobPaymentsModels; }
方案2:绑定name属性实现更稳定的赋值(推荐)
给页面中对应的input、select元素添加name属性,值和jobPayment的属性名一一对应(比如日期输入框加name="date",金额输入框加name="amount"),后续即使表单元素顺序调整也不会影响赋值逻辑:
GetAllData: function(){ var jobPayments = $("#table1 tbody tr"); var jobPaymentsModels = []; jobPayments.each(function (idx, vl) { var jobPayment = {date:"",amount:0.0,method:"", reference:""}; $(this).find("td input,select").each(function (idx, vl) { var key = vl.name; if(jobPayment.hasOwnProperty(key)){ // 只赋值预设存在的属性 jobPayment[key] = key === "amount" ? parseFloat(vl.value) || 0.0 : vl.value; } }); jobPaymentsModels.push(jobPayment); }); return jobPaymentsModels; }
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

