2011-06-24 138 views
2

我有很多html输入和一个包含大量信息的非常大的对象。按字符串查找对象索引

许多这些输入都直接链接到对象中的特定字符串。 如:

<input name="alpha_beta_gamma" type="input" val="newstring" /> 

obj = { 
     alpha: { 
      beta: { 
       gamma: 'oldString' 
      } 
     }, 
     stuff2: { 
      whatever: { 
       weathertoday: 'rainy', 
       sun: false 
      }, 
      phone: '1234567' 
     } 
    } 

值是否为“太阳”将有名为“stuff2_whatever_sun”,但“手机”字段名“stuff2_phone”和“伽马”复选框场输入字段名称“alpha_beta_gamma”。

希望你们帮我:)

...我会用一个jQuery focusOut事件:

$('input.specialClass').live('focusout', function(){ 
     obj[whatevercomeshere] = $(this).val(); 
}); 
+0

你能澄清这个问题吗?你是说输入的name属性是你想要调用的某个对象的方法名吗? – JohnFx

+0

是的。在这种情况下,“obj”是第一个层次,总是相同的,“alpha”是第二个,“beta”是第三个“ect ..事情是,它可以是两个参数(”alpha_beta“)或eg七! – jukempff

+0

我在猜测你真的想问你如何索引对象以正确更新对象,如果不理解你的大对象,我们就不能解决这个问题。详细如果是这样的话 –

回答

1

您可能需要使用eval

$('input').each( 
    function() { 
     var $this = $(this); 
     $this.val(eval("obj." + $this.attr('name').replace(/_/g, '.')); 
    } 
); 
+0

正是我所需要的,但向后。感谢您的评论提示。 – jukempff

2
$('input.specialClass').live('focusout', function(){ 
    var name = $(this).attr('name'); 
    var o = obj, parts = name.split("_"); 
    $.each(parts, function(k, v) { 
    if(k == parts.length - 1) { 
     o[v] = $(this).val(); 
    } else { 
     o = o[v]; 
    } 
    }); 
}); 
0

以下是一种方法:

var obj = {}, 
     name2json = function(o, name, val){ 
      var prop = name.splice(0, 1); 
      o[prop] = o[prop] || {}; 
      if(name.length === 0){ 
       o[prop] = val; 
      }else{ 
       name2json(o[prop], name, val); 
      } 
     }; 
    $('input.specialClass').live('focusout', function(){ 
     name2json(obj, this.name.split('_'), this.value); 
    });