2 xuton xuton 于 2016.04.29 09:42 提问

js对象根据属性名表达式解析成新的对象

如今有一个对象如下

 var obj = {
  "name": "zhansan",
  "age": 21,
  "parent.name": "lisi",
  "parent.age": 44,
  "girlfriend[0].name": "fanbinbin",
  "girlfriend[0].age": "32",
  "girlfriend[1].name": "gaoyuanyuan",
  "girlfriend[1].age": "32"
}

需实现一个函数 fn ,使fn(obj)结果如下,求解

 var obj = {
  "name": "zhansan",
  "age": 21,
  parent: {
    name: "lisi",
    age: 44,
  },
  girlfriend: [
    {name: "fanbinbin", age: 32},
    {name: "gaoyuanyuan", age: 32},
  ]
}

2个回答

b635781894
b635781894   2016.04.29 11:06

只是针对楼主的题目给出一个参考的答案,没有考虑的特别的全。楼主可以参考进行改进:

var obj = {
    "name": "zhansan",
    "age": 21,
    "parent.name": "lisi",
    "parent.age": 44,
    "girlfriend[0].name": "fanbinbin",
    "girlfriend[0].age": "32",
    "girlfriend[1].name": "gaoyuanyuan",
    "girlfriend[1].age": "32"
} ;

function fn(obj) {
    var result = {} ;
    var obj_array = [] ;

    for(var objKey in obj) {    // 循环对象属性
        if(objKey.indexOf('.') == -1) {     // 属性中不包含'.',也就是此属性不是一个新的对象,直接添加结果中
            result[objKey] = obj[objKey] ;
        } else {        // 如果属性中包含'.',分两种情况
            if(objKey.indexOf('[') != -1 && objKey.indexOf(']') != -1) {    // 属性中包含'[]',表示是一个数组对象
                var obj_array_name = objKey.substring(0, objKey.lastIndexOf('[')) ;     // 提取对象名
                if(result[obj_array_name] == undefined) {     // 在结果中新建此对象
                    result[obj_array_name]= [] ;
                }
                var obj_array_index = objKey.substring( objKey.indexOf('[') + 1, objKey.indexOf(']')) ;     // 获取数组下标
                if(result[obj_array_name][obj_array_index] == undefined) {      // 创建对象
                    result[obj_array_name][obj_array_index] = {} ;
                }
                result[obj_array_name][obj_array_index][objKey.substring(objKey.indexOf(']') + 2)] = obj[objKey] ;      // 赋值到数组对象
            } else {        // 属性中只包含'.',表示是一个简单对象
                var obj_obj_name = objKey.substring(0, objKey.lastIndexOf('.')) ;       // 提取对象名
                if(result[obj_obj_name] == undefined) {     // 在结果中新建此对象
                    result[obj_obj_name]= {} ;
                }
                result[obj_obj_name][objKey.substring(objKey.lastIndexOf('.') + 1)] = obj[objKey] ;     // 赋值到新对象
            }
        }
    }

    console.log(result) ;

    return result ;
}

fn(obj) ;

xuton
xuton   2016.04.29 11:24
我测试了下,用正则稍微简单,但也不是考虑周全,比如二维数组
 var obj = {
    "xx[0]": 1,
    "xx[1]": 2,
    "name": "zhansan",
    "age": 21,
    "parent.name": "lisi",
    "parent.age": 44,
    "girlfriend[0].name": "fanbinbin",
    "girlfriend[0].age": "32",
    "girlfriend[1].name": "gaoyuanyuan",
    "girlfriend[1].age": "32"
  }

  var rt = {};
  function fn(obj, rt) {
    for (var k in obj) {
      var group = /([\w\d]+)(?:\[(\d+)\])?(\.)?(.+)?/.exec(k)
      let [a,b,c,d,e] = group
      let v = obj[k];

      if (!e) {//无属性名
        if (c) {//如果是数组
          rt[b] = rt[b] || []
          rt[b][c] = v
        } else {
          rt[b] = v;
        }
      } else {
        if (c) {
          rt[b] = rt[b] || []
          rt[b][c] = fn({[e]: v}, rt[b][c] || {})
        } else {
          //rt[b] = rt[b] || {}
          rt[b] = fn({[e]: v}, rt[b] || {})
        }
      }
    }
    return rt
  }

  fn(obj, rt)
  console.log(rt)
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
js 通过对象属性名称获取属性值的注意要点
1、不能是变量 var obj = {}; obj.AttrName = 'Tom' 注意:通过 对象.属性名 获取属性值的时候,属性名(AttrName )不能是一个变量。 2、可以是变量 原始数据数组: var rawDataList = [ { "countDate": "2018-04-08", "countNum": "2"...
js如何获取对象中的属性名
js提供了for  in 来遍历对象中的所有属性名 Demo: var Person = { name:"张三", say:function(){ alert("Hello World"); } } for(var name in Person){//遍历对象属性名 console.log(name+":"+Person[name]); } 浏览器调试打印结果:
js高效更改对象中属性名
一个json对象:var json = [ { "Id":"3972679ef2c04151972b376dd88e6413", "T_CourseId":"7a4494aae1804d3e94094583249750fe", "CourseName":"英语", "Code":"engl
js中获取对象的属性名称
在网上搜的时候基本都是用for循环获取对象属性数组,其实有个更简单的方法: function getObjKeys() {     var obj = {         "name": "zhangsan",         "age": 30     };     let keys = Object.keys(obj);     console.log(keys); }
显示js对象的所有属性名称和属性值
参考文章:http://blog.csdn.net/dxmgood/article/details/6360815 // 显示js对象的所有属性名称和属性值 function displayProp(obj){ var msg =""; for(var name in obj){ msg += na
记录,javascript中对象的属性名是字符串,却可以不用引号
问题描述:今日看书,里面介绍js的对象的属性名是包括空字符串在内的所以字符串 问题来了,我们平时定义的对象如下,是没有引号""or''的 var someone  = {     first_name : "Jeo",     second_name : "Mike" }; 所以我写了以下程序测试, var stooge = {     "first_name" : "Jeo",
js通过value找到key; js通过对象的属性值找到属性名;
//创建一个方法,返回value值对应的keyfunction findKey (obj,value, compare = (a, b) => a === b) {  return Object.keys(obj).find(k => compare(obj[k], value))}//新建一个对象var  nameMap = {       'Afghanistan':'阿富汗', ...
javascript中对象的属性名为变量的场景
今天帮伙伴解决一个问题,开发功能中对象的属性名是一个变量。按照他编写的代码赋值后的对象,直接将变量名作为了属性名。以下是其编写代码: var aa = "ok"; var bb = "no"; var obj = {aa:bb}; console.log(obj); 输出的对象是: {aa: "no"} 这是因为 var obj = {aa:bb};  这样的写法是和使用对象的点运算符赋
js 对象属性名为变量
js 对象属性名为变量
js 对象动态添加属性、合并属性
1、对象合并: var obj = {a:1, name: 'test'}; var shuxing = {name:"super",sex:"19",work:"IT"}; for(var r in shuxing){ eval("obj."+r+"=shuxing."+r); } alert(obj.a); alert(obj.name); alert(obj.sex); alert(obj