Chi*_*nke 46 javascript string nested properties
假设我们只被给予
var obj = {};
var propName = "foo.bar.foobar";
Run Code Online (Sandbox Code Playgroud)
我们如何将属性obj.foo.bar.foobar设置为某个值(比如"hello world")?所以我想实现这一点,而我们只在字符串中有属性名称:
obj.foo.bar.foobar = "hello world";
Run Code Online (Sandbox Code Playgroud)
Vis*_*ioN 76
function assign(obj, prop, value) {
if (typeof prop === "string")
prop = prop.split(".");
if (prop.length > 1) {
var e = prop.shift();
assign(obj[e] =
Object.prototype.toString.call(obj[e]) === "[object Object]"
? obj[e]
: {},
prop,
value);
} else
obj[prop[0]] = value;
}
var obj = {},
propName = "foo.bar.foobar";
assign(obj, propName, "Value");
Run Code Online (Sandbox Code Playgroud)
Cer*_*rus 12
由于这个问题似乎是由不正确的答案回答的,我只是从类似的问题中引用正确的答案
function setDeepValue(obj, value, path) {
if (typeof path === "string") {
var path = path.split('.');
}
if(path.length > 1){
var p=path.shift();
if(obj[p]==null || typeof obj[p]!== 'object'){
obj[p] = {};
}
setDeepValue(obj[p], value, path);
}else{
obj[path[0]] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
使用:
var obj = {};
setDeepValue(obj, 'Hello World', 'foo.bar.foobar');
Run Code Online (Sandbox Code Playgroud)
编辑:我创建了一个jsPerf.com 测试用例来将接受的答案与我的版本进行比较。事实证明,我的版本更快,尤其是当你深入时。
var nestedObjectAssignmentFor = function(obj, propString, value) {
var propNames = propString.split('.'),
propLength = propNames.length-1,
tmpObj = obj;
for (var i = 0; i <= propLength ; i++) {
tmpObj = tmpObj[propNames[i]] = i !== propLength ? {} : value;
}
return obj;
}
var obj = nestedObjectAssignment({},"foo.bar.foobar","hello world");
Run Code Online (Sandbox Code Playgroud)
?
?
| 归档时间: |
|
| 查看次数: |
21579 次 |
| 最近记录: |