js 复制对象部分属性

1,944 阅读2分钟

已知

let obj =
{
    "code":"001",
    "name":"jason",
    "title":"gogogo",
    "list": [
        { 
            "code":"002",
            "name":"jason2",
            "title":"gogogo2",
            "subList": [
                {
                   "code":"003",
                    "name":"jason3",
                    "title":"gogogo3",
                },
                 {
                   "code":"0031",
                    "name":"jason31",
                    "title":"gogogo31",
                }
            ],
             "subList2": [
                {
                   "code":"004",
                    "name":"jason4",
                    "title":"gogogo4",
                },
                 {
                    "code":"0041",
                    "name":"jason41",
                    "title":"gogogo41",
                }
            ]
        }
    ]
}

需要提取为对象如下

let copyObj =
{ 
    "name":"jason", 
    "list": [
        {  
            "name":"jason2", 
            "subList": [
                {
                   "code":"003 
                },
                 {
                   "code":"0031", 
                }
            ]
        }
    ]
}

1.对象处理

1.1直接具体属性赋值

let obj = {
    "code":"001",
    "name":"jason",
    "title":"gogogo"
}
let copyObj = {
  name: obj.name,
} 

1.2.复制+删除属性

let obj = {
    "code":"001",
    "name":"jason",
    "title":"gogogo"
}
const copyObj = { ...obj }; // 复制所有字段
delete copyObj.code; // 删除不用的
delete copyObj.title; // 删除不用的 

1.3.解构+剩下属性

let obj = {
    "code":"001",
    "name":"jason",
    "title":"gogogo"
}
let { code,title, ...obj } = obj; // obj 包含除了d之外所有的属性, obj对象会被改变
const copyObj = obj;

1.4.遍历+参数判断 赋值

let obj = {
    "code":"001",
    "name":"jason",
    "title":"gogogo"
}
function copyObj(obj) {
    var o = {},
    attr = Array.prototype.slice.call(arguments).slice(1);
    attr.forEach(function(val, index) {
    if (val in obj) { o[val] = obj[val]; }
    });
    return o;
}
console.log(copyObj(obj, 'name'));  

1.5.reduce遍历+参数判断 赋值

let obj = {
    "code":"001",
    "name":"jason",
    "title":"gogogo"
}
const filterKeys = (target, keys) => keys.reduce((res, k) => {
    res[k] = target[k]
    return res
}, {
})

let copyObj = {...filterKeys(obj,['name'])}

2.数组处理

1.for 方法遍历

let subList = [
    {
       "code":"003",
        "name":"jason3",
        "title":"gogogo3",
    },
     {
       "code":"0031",
        "name":"jason31",
        "title":"gogogo31",
    }
]
let  copyList = []
for (let i = 0; i < subList.length; i++) {
   copyList.push({name:subList[i].name})  
}    

2.map()方法遍历

let subList = [
        {
           "code":"003",
            "name":"jason3",
            "title":"gogogo3",
        },
         {
           "code":"0031",
            "name":"jason31",
            "title":"gogogo31",
        }
    ]
let copyList =  subList.map(o => o.name)//   [  "name":"jason3",  "name":"jason31"] 

完整例子

let {name,list} = obj; 
list = list.map(o => { 
    o.subList = o.subList.map( o => o.code) 
    return {name:o.name,subList:o.subList}
})
let copyObj = {
    name,
    list
} 
console.log(copyObj)

补充

对于层级较深的对象可以使用.的链式访问,封装方法防止访问为空报错

字符串链式访问对象

const readLink = (target, link) => link.split('.').reduce((res, cur) => {
    try{
        return res[cur]
    }catch(e){
        return undefined
    }
}, target)
let a = {b:{c:{d:"xxxxx"}}}

readLink(a,"b.c.d") // 输出xxxxx