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