2017-02-23 27 views
5

Tôi có đối tượng JavaScript trông như thế này. JavaScript: Cập nhật giá trị đối tượng bằng cách truy xuất tên biến từ chuỗi

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

và tôi có một số mã HTML mà trông như thế này

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

Mở HTML tôi đã được lưu trữ mà biến JavaScript để thay đổi nếu tôi làm bất kỳ thay đổi lĩnh vực đó. Tôi đã viết mã JavaScript trông như thế này.

$(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()); 
}); 

Có phương pháp nào tốt hơn cho vấn đề này, hiện nay tôi đang sử dụng eval() mà tôi không muốn sử dụng, như nhiều yếu tố sẽ có sự kiện 'thay đổi' và chương trình 'eval' có thể ảnh hưởng đến việc thực hiện mã của tôi.

+1

đầu tiên bạn đã 2 thuộc tính dữ liệu có tên giống nhau – madalinivascu

+0

chang? điều đó có nên thay đổi không? '[data-bind = onchange]' ... phải là '[data-bind = onChange]'? quá nhiều sai lầm –

+1

Đầu tiên '.on ('chang',' nên là '.on ('thay đổi','. Thứ hai, * Có cách nào tốt hơn *, nếu câu hỏi là về cải tiến/tối ưu hóa, vui lòng đăng nó trên CodeReviews – Rajesh

Trả lời

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"));

Các vấn đề liên quan