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

时间:2017-01-27 18:09:25

标签: javascript

我有一个像这样的命名键的对象

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

我要转换为:

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

有任何关于这种方式的想法吗?

5 个答案:

答案 0 :(得分:4)

您可以使用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>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以尝试以下操作:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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