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

问题描述

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-08-26 14:13:34

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

如何通过对象的属性名,创建对象的属性?

问题描述 如何通过对象的属性名,创建对象的属性?谢谢.... 解决方案 解决方案二:对象类对象=new对象类();对象.属性=new属性类();这样就可以了我是小菜鸟!说的不好清见谅,希望能够帮到你!解决方案三:如何通过对象的属性名,创建对象的属性?什么意思?解决方案四:ofcourse

在JS中将JSON的字符串解析成JSON数据格式一般有两种方式

在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用jQuery的each方法来遍历 用jQuery解析JSON数据的方法,作为jQuery异步请求的传输对象,jQuery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明. 这里首先

遍历js中对象的属性和值的实例_javascript技巧

今天优化项目时,遇到了关于"遍历js中对象的属性和值"的需求.之所以会有这个需求,是因为要做一个局部刷新表格内容的js插件.刚开始我去网上荡了一个js分页插件,但是智商实在捉急,搞了半天没搞出来!后来就怒了,干脆自己写一个好了.结果就遇到了这个问题! 问题:通过遍历属性名数组,获取对象的属性值失败 刚开始的错误代码如下: for(var i=0;i<dataList.length;i++) { var dataLine="<tr>"; for(va

json属性名为什么要双引号(个人猜测)_javascript技巧

原因一: 更加规范,利于解析 原因二: 避免class等关键字引起的不兼容问题 原因三: 可能也是最隐晦的: var a = 00; var b = {00: 12}; a in b; --> true var a = 0; var b = {'00': 12}; a in b; --> false 个人猜测如果js对象的属性名为非string类型,会先进行类型转换, 但是这个过程中可能会出现非预期性的值,虽然仅属个例,但养成一个好习惯还是很有必要的 以上是小编为您精心准备的的内容,在的博客.

Python中动态获取对象的属性和方法的教程_python

首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding: UTF-8 import sys # 模块,sys指向这个模块对象 import inspect def foo(): pass # 函数,foo指向这个函数对象 class Cat(object): # 类,Cat指向这个类对象 def __init__(self, name='kitty'): self.name = name def sayHi(self): # 实例方法,sayHi指向这个方法对象,使用类或实例.

C#集合对象的属性赋值

(一)前言 继<对象属性之间的相互赋值 >后,关于集合对象属性的赋值,主要可以通过循环遍历集合中的对象来进行属性间的赋值.这些可以运用于不同对象之间.相关属性类似的情况.最常见的是web services与silverlight之间的对象赋值(对象之间的属性值只有一部分是需要的),这样可以减少silverlight对web services的依赖. (二)具体实现 通过反射将源对象与目标对象之间的属性赋值.源对象的属性名.属性类型必须与目标对象的属性名.属性类型一致,并且源对象的属性必须是可读

jquery动态遍历Json对象的属性和值的方法_javascript技巧

1.遍历 json 对象的属性 //定义json对象 var person= { name: 'zhangsan', pass: '123', fn: function(){ alert(this.name+"的密码="+this.pass); } } //遍历person属性包括方法,如果不想显示出方法,可用typeof(person[item])== "function"来判断 for(var item in person){ alert("perso

js中将具有数字属性名的对象转换为数组_javascript技巧

虽然不太常用,但我们的确可以给对象添加以数字为属性名的属性: 复制代码 代码如下: var obj = {}; obj[0] = 1; obj[1] = 2; 这个对象并不是数组类型,那有没有办法把它转换为数组类型呢?jQuery代码中采用了Array.prototype.slice把这种对象转换为数组,但我试了好几遍,就是不行: 复制代码 代码如下: var obj = {}; obj[0] = 1; obj[1] = 2; alert(Array.prototype.slice.call(o

JS批量操作CSS属性详细解析

 这篇文章主要介绍了JS批量操作CSS属性.需要的朋友可以过来参考下,希望对大家有所帮助  代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server">     <title></title>     <style type="text/css">         .day         {