2012-06-14 40 views
0

我有一個簡單的點符號getter函數,我很想有一個以相同方式工作的setter。有任何想法嗎?實現點符號Getter/Setter

var person = { 
    name : { 
     first : 'Peter', 
     last : 'Smith' 
    } 
}; 

// --- 

var dotGet = function(str, obj) { 

    return str.split('.').reduce(function(obj, i) { 
     return obj[i]; 
    }, obj); 

}; 

var dotSet = function(str, value, obj) { 

    // updated, thx to @thg435 
    var arr = str.split('.'); 

    while (arr.length > 1) { 
     obj = obj[arr.shift()]; 
    } 

    obj[arr.shift()] = value; 

    return obj; 

} 

// returns `Peter` 
var a = dotGet('person.name.first', person); 

// should set `person.name.first` to 'Bob' 
var b = dotSet('person.name.first', 'Bob', person); 
+1

是否有您不使用本機JS如下'的console.log(person.name.first)的理由;'和'person.name.first = '鮑勃' ;'? –

+2

請參閱http://stackoverflow.com/questions/10934664/convert-string-in-dot-notation-to-get-the-object-reference和其他許多 – georg

+0

@skwee我使用get/set來訪問類中的私有變量,上面的代碼只是一個簡化 – ezmilhouse

回答

-1

試試這個:

var dotSet = function(str, value, obj) { 
    var keys = str.split('.'); 
    var parent = obj; 

    for (var i = 0; i < keys.length - 1; i++) { 
    var key = keys[i]; 

    if (!(key in parent)) { 
     parent[key] = {}; 
     parent = parent[key]; 
    } 
    } 

    parent[keys[keys.length - 1]] = value; 
} 

var person = {}; 
dotSet('person.name.first', 'Bob', person); 

它生產這個對象:

{人:{名稱:{第一: '鮑勃'}}}

+0

在這個實現中有一個錯誤。用Jan的解決方案替換dotSet按預期工作。 執行以下操作: ''' var obj = {}; dotSet('0.first_key',[0,1,2],obj); dotSet('0.second_key',[3,4,5],obj); // obj => {'0':{first_key:[0,1,2]},second_key:[3,4,5]} ''' – Glavin001

3
var set = function (exp, value, scope) { 
    var levels = exp.split('.'); 
    var max_level = levels.length - 1; 
    var target = scope; 
    levels.some(function (level, i) { 
    if (typeof level === 'undefined') { 
     return true; 
    } 
    if (i === max_level) { 
     target[level] = value; 
    } else { 
     var obj = target[level] || {}; 
     target[level] = obj; 
     target = obj; 
    } 
    }); 
}; 

你可以檢查出my expression compiler,你需要做什麼和更多。

用法是:

var scope = {}; 
set('person.name', 'Josh', scope); 

scope.person.name === 'Josh'