[英]Javascript convert object with array string keys to key/name value's
我有一个带有这样命名键的对象
{
'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,但是对键使用不同的方法,但随后会遇到对象deep merge
的问题,因此可以使用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>
使用for..in
循环并构造一个新对象:
var obj = { 'name[first]': 'john', 'name[last]': 'doe' }; var newObj = {} for (var key in obj) { var parts = key.split(/\\[|\\]/); if(!newObj.hasOwnProperty(parts[0])) newObj[parts[0]] = {}; newObj[parts[0]][parts[1]] = obj[key]; } console.log(newObj);
您可以尝试以下方法:
var obj = { 'name[first]': 'john', 'name[last]': 'doe' } var result = Object.keys(obj).reduce(function(newObj, prop) { var key = prop.split(/\\[|\\]/)[1]; newObj[key] = obj[prop]; return newObj; }, {}) console.log(result);
使用Object.keys
, Array.prototytpe.reduce
和String.prototype.match
函数的解决方案:
var obj = {'name[first]': 'john', 'name[last]': 'doe'}; var result = Object.keys(obj).reduce(function (o, key) { var parts = key.match(/^(\\w+)\\[(\\w+)\\]$/); if (!o[parts[1]]) { o[parts[1]] = {}; } o[parts[1]][parts[2]] = obj[key]; return o; }, {}); console.log(result);
var obj = { 'name[first]': 'john', 'name[last]': 'doe' } var newObj = {}; for (var property in obj) { if (obj.hasOwnProperty(property)) { var keys = property.match(/(\\w+)/g); if (keys && keys.length == 2) { newObj[keys[0]] = newObj[keys[0]] || {}; newObj[keys[0]][keys[1]] = obj[property]; } } } console.log(newObj);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.