已知
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