JavaScript:通过从字符串中检索变量名来更新对象值
JavaScript: Update a object value by retrieving variable names from string
我有一个 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()
,因为许多元素将有 'change' 事件并显示 'eval'会影响我的代码的性能。
// 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"));
我有一个 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()
,因为许多元素将有 'change' 事件并显示 'eval'会影响我的代码的性能。
// 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"));