我有一个带有这样命名键的对象
{
'name[first]': 'john',
'name[last]': 'doe'
}
我想转换成:
{
'name' : {
'first' : 'john',
'last' : 'doe'
}
}
有什么好的方法可以做到这一点吗?
最佳答案
您可以使用reduce()
返回obj和正则表达式来分割键。
var obj = {
'name[first]': 'john',
'name[last]': 'doe'
}
var result = Object.keys(obj).reduce(function(r, e) {
var key = e.split(/\[(.*?)\]/)
if (!r[key[0]]) r[key[0]] = {}
r[key[0]][key[1]] = obj[e]
return r;
}, {})
console.log(result)
对于嵌套的键结构,您可以再次使用 reduce,但使用不同的键方法,但随后您会遇到对象的深度合并
问题,为此您可以使用 lodash。
var obj = {
'name[first[foo]]': 'john',
'name[last]': 'doe',
'name[last[foo[bar]]]': 'doe'
}
var result = Object.keys(obj).reduce(function(r, e) {
var key = e.replace(/\[/g, '.').replace(/\]/g, '').split('.')
var o = {}
key.reduce(function(re, el, i) {
return i != key.length - 1 ? re[el] = {} : re[el] = obj[e]
}, o)
r = _.merge(r, o)
return r;
}, {})
console.log(JSON.stringify(result, 0, 4))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
关于Javascript 将带有数组字符串键的对象转换为键/名称值的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41900392/