繁体   English   中英

Javascript将具有数组字符串键的对象转换为键/名称值的

[英]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.keysArray.prototytpe.reduceString.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM