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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!