错误:在存储在对象中的空数组上使用.push时,无法读取未定义的属性推送

时间:2019-02-28 00:41:57

标签: javascript jquery

当用户单击“保存”时,我需要从输入中收集所有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);
});

我在这里想念什么?

1 个答案:

答案 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

请参见Operator Precedence

尝试一下:

Uncaught TypeError: Cannot read property 'push' of undefined

正在运行的JSFiddle演示:https://jsfiddle.net/n6bg3da8/