将属性动态分配给 JS 对象

2022-01-24 00:00:00 json jquery javascript coffeescript

我需要为一个 js 对象动态添加属性,这是我通过 eval() 实现的:

I needed to dynamically add properties to an js Object, which I achieved via eval():

$ ->

  #Methods
  window.add_address = (attributes, id=new Date().getTime())->
    $container = $('ul#addresses_list')
    $unit = $('<li>')

    $.each attributes, (key,value)->
      $input = $('<input type="hidden">')
      $input.attr 'name', "contact[addresses_attributes][#{id}][#{key}]"
      $input.val value
      $unit.append $input

    $container.append $unit

  #Events

  #Add address button
  $('a#add_address').on 'click', (ev)->
    attributes =  new Object
    $('#address_fields').find('input').each ->
      eval("attributes.#{$(this).attr 'id'}='#{$(this).val()}'");

    add_address attributes

这很完美,但我觉得 eval() 很尴尬,有没有办法让这个更漂亮"?我的意思是,我搜索了像 eval() 这样的替代方法a href="http://api.jquery.com/serializeArray/" rel="nofollow">Jquery .serializeArray() 但它似乎只适用于查询表单,我需要从那个 #address_fields div.

This works perfect but I feel awkward with the eval(), is there anyway to do this "prettier"? I mean, I searched for alternatives like the Jquery .serializeArray() but it seems to work only with a queried form and I need to get the inputs from that #address_fields div.

推荐答案

使用 object['key'] 表示法

attributes[$(this).attr('id')] = $(this).val();

使用以下方法创建对象也非常有效:

It's also very efficient to create object using:

var attributes={};

类似的行可以用相同的符号编写 jquery 方法

Along similar lines can write the jquery methods in same notation

   attributes[$(this)['attr']('id')] = $(this)['val']();

相关文章