简体   繁体   English

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

[英]Javascript convert object with array string keys to key/name value's

I have an object with named keys like this 我有一个带有这样命名键的对象

{ 
 'name[first]': 'john',
 'name[last]': 'doe'
 }

that I want to convert to: 我想转换为:

{ 
 'name' : {
     'first' : 'john',
     'last' : 'doe'
   }
 }

Any idea on an elegent way to do this? 有什么想法可以做到这一点吗?

You can use reduce() to return obj and regular expression to split key. 您可以使用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) 

For nested key structure you could again use reduce but with different approach to keys but then you face problem of deep merge of object and for that you can use lodash. 对于嵌套的键结构,您可以再次使用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> 

Using a for..in loop and constructing a new object: 使用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); 

You can try the following: 您可以尝试以下方法:

 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); 

The solution using Object.keys , Array.prototytpe.reduce and String.prototype.match functions: 使用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