问题描述
- 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}, ] }
解决方案
只是针对楼主的题目给出一个参考的答案,没有考虑的特别的全。楼主可以参考进行改进:
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) ;
解决方案二:
我测试了下,用正则稍微简单,但也不是考虑周全,比如二维数组
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 = /([wd]+)(?:[(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)
时间: 2024-10-29 09:18:57