2017-08-17 95 views
0
var input = { 
    "id": 'AB', 
    "specified.name": 'some name', 
    "specified.manufacturer": 'some manufacturer', 
    "specified.environment.state": 'good' 
} 

/** 
var expectedOutput = { 
    id:'AB', 
    specified: { 
    name: 'some name', 
    manufacturer: 'some manufacturer', 
    environment: { 
     state: 'good' 
    } 
    } 
}; 
**/ 

https://jsbin.com/senehijula/edit?html,js,output从多个字符串对象创建嵌套的对象,JavaScript的

我知道有一些类似的问题,但不是很喜欢这一个。

任何优雅的方式呢?

回答

1

那么,你可以拆分字符串和环通创建所需的数据结构 - 参见下面的演示:

var input = { 
 
    "id": 'AB', 
 
    "specified.name": 'some name', 
 
    "specified.manufacturer": 'some manufacturer', 
 
    "specified.environment.state": 'good' 
 
} 
 

 
var output = {}; 
 
Object.keys(input).forEach(function(e){ 
 
    let keys = e.split('.'); 
 
    let key = keys.pop(); 
 
    let obj = keys.reduce(function(p,k){ 
 
    p[k] = p[k] || Object.create(null); 
 
    return p[k]; 
 
    }, output); 
 
    obj = obj || Object.create(null); 
 
    obj[key] = input[e]; 
 
}); 
 

 
console.log(output);
.as-console-wrapper{top:0;max-height:100%!important;}

+0

任何特别原因需要使用'的Object.create(空)',而不是字面的'{}'?他从来没有澄清,如果他使用输出对象作为一个简单的地图 – GMaiolo

+0

nope,但'Object.create(null)'不会继承'原型'...虽然这里没关系:) – kukkuz

1

你可以第一个循环对象使用for...in循环,然后在.处拆分每个键并使用reduce来构建对象。

var input = { 
 
    "id": 'AD101', 
 
    "specified.name": 'BRYH', 
 
    "specified.manufacturer": 'some manufacturer', 
 
    "specified.environment.state": 'good' 
 
} 
 

 
var result = {} 
 
for (var k in input) { 
 
    k.split('.').reduce(function(r, e, i, arr) { 
 
    return r[e] || (r[e] = arr[i + 1] ? {} : input[k]) 
 
    }, result) 
 
} 
 

 
console.log(result)