超级懒爸 2016-04-29 01:42 采纳率: 0%
浏览 1584

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条回答

  • 静心事成 2016-04-29 03: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) ;
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#c语言#的问题:这个六个方程输入程序可以得出角度角速度角加速度
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油