当用户单击“保存”时,我需要从输入中收集所有input_product
类的数据,并使用以下格式将其编译为data
:
data = {param1:[{upc:'upc', value:'value'}, ... ], ... paramN: [ ... ]}
我尝试使用下面的代码执行此操作,但始终收到此错误:
未捕获的TypeError:无法读取未定义的属性“ push”
$('.save').on('click', function() {
event.preventDefault();
var data = {};
$('.input_product').each(function() {
const
param = $(this).attr('name'),
upc = $(this).parent().parent().attr('id'),
value = $(this).val()
console.log(param, upc, value); //prints qty, 1001, 5
if (value && param) {
if (!param in data) {
data[param] = [];
}
data[param].push({'upc':upc, 'value':value}); // Error is thrown here
}
});
window.someFunction(data);
});
我在这里想念什么?
答案 0 :(得分:3)
in
运算符的优先级低于!
运算符。您需要在param in data
前后加上方括号;更改
if(!param in data)
到
if(!(param in data))
当前,您正在做的是将param
的值转换为布尔值,将其取反,然后检查该取反的结果是否作为对象data
中的键存在(即,您要写的内容等效于if((!param) in data)
),而您想检查param
是否作为data
中的键,然后取反该结果以执行某些代码(如果{{ 1}}在param
中不作为键存在。结果,您永远不会在data
中设置键param
的值,因此它停留在data
上,您会得到undefined
。
尝试一下:
Uncaught TypeError: Cannot read property 'push' of undefined
正在运行的JSFiddle演示:https://jsfiddle.net/n6bg3da8/