2017-02-23 41 views
5

检索变量名的对象值我有一个JavaScript对象,它看起来像这样。 的JavaScript:更新由字符串

var myObj = [ 
    { 
    "HOLIDAY": { 
     "Sun": "Date", 
     "Mon": "Date", 
     "Tue": "Date", 
     "Wed": "Date", 
     "Thr": "Date", 
     "Fri": "Date", 
     "Sat": "Date" 
    } 
    } 
] 

和我有一些HTML代码,看起来像这样

<input data-event="change" 
      data-variable="myObj" 
      data-bind="[0]['HOLIDAY']['Sun']" 
      type="text"> 

在HTML我已经存储了JavaScript变量,如果我做任何改变,该字段进行修改。我写了JavaScript代码,看起来像这样。

$(document).on('change', '[data-event= change]', function(){ 
    //get-variable-name where to bind data 
    //Get object location inside the variable 
    var sVarName = $(this).data('variable'); 
    var sObjLoca = $(this).data('bind'); 
    eval(sVarName+sObjLoca +' = ' $(this).val()); 
}); 

是否有这个问题的任何更好的办法,目前我使用eval()我不想使用,因为很多元素都会有“变化”事件,并显示“EVAL”能效性能我的代码。

+1

第一你有2个数据属性名称相同 – madalinivascu

+0

昌?应该是改变? '[数据绑定=平变化]'...应该说是'[数据绑定=的onChange]'?这么多的不正当 –

+1

第一个'。对(“昌”,'应该'。对(“变”,'。其次,*有没有更好的方法*,如果问题是关于改进/最佳化,请张贴在CodeReviews – Rajesh

回答

3

// Input 
 
var myObj = [{ 
 
    "HOLIDAY": { 
 
    "Sun": "Date", 
 
    "Mon": "Date", 
 
    "Tue": "Date", 
 
    "Wed": "Date", 
 
    "Thr": "Date", 
 
    "Fri": "Date", 
 
    "Sat": "Date" 
 
    } 
 
}] 
 

 
// Function 
 
function updateObject(object, newValue, path) { 
 
    var stack = path.replace(/\]\[/g, '.').replace(/['"\[\]]/g, '').split('.'); 
 

 
    while (stack.length > 1) { 
 
    object = object[stack.shift()]; 
 
    } 
 
    object[stack.shift()] = newValue; 
 
    return object; 
 
} 
 

 
// Output 
 
console.log(updateObject(myObj, 'test1', "[0]['HOLIDAY']['Sat']")); 
 
console.log(updateObject(myObj, 'test2', "[0]['HOLIDAY']['Tue']")); 
 

 
// Can also set like below 
 
console.log(updateObject(myObj, 'otherway', "0.HOLIDAY.Wed"));