function test(param) {
let output;
if(param.a &&
param.a.b &&
param.a.b.c &&
param.a.b.c.d
) {
output = param.a.b.c.d;
}
}
比如,我要知道里面parma中的b,那么要经过这样的多层判断
有没有简单一些的方法呢
function test(param) {
let output;
if(param.a &&
param.a.b &&
param.a.b.c &&
param.a.b.c.d
) {
output = param.a.b.c.d;
}
}
比如,我要知道里面parma中的b,那么要经过这样的多层判断
有没有简单一些的方法呢
楼上说的optional chaining operator "?."是一个很好的方法,但是有些地方并不支持新的语法。这些地方你可以尝试使用:
output = param.a && param.a.b && param.a.b.c && param.a.b.c.d
这种连续与的表达式,如果整个表达式结果为真,会返回最后的param.a.b.c.d
:
但是需要注意,如果整个表达式返回值为false,会返回第一个false的值:
我只提供一种思路,经供参考
const param = {
a: {
b: {
c: {
d: 1,
},
},
},
};
function deepAccess(object, res, defaultValue = "") {
const attrs = res.split(".");
try {
return attrs.reduce((result, prev) => {
return result[prev];
}, object);
} catch (error) {
return defaultValue;
}
}
console.log(deepAccess(param, "a.b.s.d", 2))
挖掘呗
export const dig = (obj, targetKey) => {
if (targetKey in obj) {
return obj[targetKey]
} else {
const innerArrayData = Object.values(obj)
const finded = innerArrayData.reduce((acc, cur) => {
if (acc !== undefined) return acc
if (typeOfData(cur) === '[object Object]') {
return dig(cur, targetKey)
}
}, undefined)
return finded
}
}
export const typeOfData = (data) => {
return Object.prototype.toString.call(data)
}
const param = {
a: {
b: {
c: 11111
}
}
}
const result1 = dig(param, 'c') // 11111
const result2 = dig(param, 'n') // undefined
// 比如这是一个后端返回的不完整数据
var data = {
name: '张三',
};
// 我自己写过一个方案,处理默认数据
// 我明确知道层级关系,比如 data.info.job.id。我需要保证到 job时,这个数据还是 {}
// 然后 就可以肆无忌惮的使用 myData.info.job.id
var myData = ns.dataLayout({
info: { // info是个键值对
job: { // job是个键值对。里面有些信息
}
}
}, data)
// 可以试试这个
// 不过有个比较尴尬的问题,就是你的 key 必须是唯一值,
// 如果你的 key 可能存在于多级,或者 value 中就不太靠谱
new RegExp(key)JSON.stringify(params)
16 回答2.7k 阅读✓ 已解决
6 回答4k 阅读✓ 已解决
9 回答3.3k 阅读✓ 已解决
14 回答5.2k 阅读
6 回答3k 阅读✓ 已解决
7 回答1.7k 阅读
14 回答2k 阅读
这是个好问题,日常编码太多场景要处理这种情况了;显然地,ECMAScript委员会应该也注意到了广大程序员的这个需求,所以同学 ECMAScript最新的语法 optional chaining operator "?." 了解一下,文档传送门:
https://developer.mozilla.org...