JavaScript:通过从字符串中检索变量名来更新对象值

时间:2017-02-23 05:51:33

标签: javascript jquery html eval 2-way-object-databinding

我有一个看起来像这样的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()我不想使用的问题,因为很多元素都会改变这个问题&#39;活动和节目&#39; eval&#39;可以影响我的代码的性能。

1 个答案:

答案 0 :(得分:3)

&#13;
&#13;
 // 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"));
&#13;
&#13;
&#13;