2017-02-23 43 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

чана? должны ли быть изменения? '[data-bind = onchange]' ... должно быть '[data-bind = onChange]'? так много неполадок –

+1

Первый '.on ('chang',' должен быть '.on ('change','. Second, * Есть ли лучший подход *, если речь идет об улучшениях/оптимизации, отправьте его на 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"));