作为使用Google Apps脚本(GAS)开发Google工作表自定义功能的一部分,我试图获取对象属性(键?)名称的扁平树。我对任何值都不感兴趣,我只想打印出所有对象的属性(键)名称的点符号树。该物体具有未知深度和未知结构。
例:
{
"level1_prop1": "stuff",
"level1_prop2": 0,
"level1_prop3": 50,
"level1_prop4": [{
"level2_prop1": "more stuffs, and things",
"level2_prop2": "10000",
"level2_prop3": {
"level3_prop1": {
"level4_prop1": "other stuff",
"level4_prop1": "so much stuff",
},
"level3_prop2": null,
}
}, {
"level2_prop1": "still more and more",
"level2_prop2": "10001",
"level2_prop3": {
"level3_prop1": {
"level4_prop1": "other stuffssssss",
"level4_prop1": "so much stuffssssssss",
},
"level3_prop2": null,
}
}
]
}
字符串或字符串数组中的所需输出:
object.level1_prop1
object.level1_prop2
object.level1_prop3
object.level1_prop4
object.level1_prop4.level2_prop1
object.level1_prop4.level2_prop2
object.level1_prop4.level2_prop3
object.level1_prop4.level2_prop3.level3_prop1
object.level1_prop4.level2_prop3.level3_prop1.level4_prop1
object.level1_prop4.level2_prop3.level3_prop1.level4_prop2
object.level1_prop4.level2_prop3.level3_prop2
我最终希望使用它来有选择地删除整个对象中的特定属性/键。例如:
remove(object.level1_prop4.level2_prop3.level3_prop1)
会导致
object.level1_prop1
object.level1_prop2
object.level1_prop3
object.level1_prop4
object.level1_prop4.level2_prop1
object.level1_prop4.level2_prop2
object.level1_prop4.level2_prop3
object.level1_prop4.level2_prop3.level3_prop2
更新:添加答案旨在用于自定义Google Apps脚本(GAS)功能的规范,因为当我将它们粘贴到我的code.gs文件中时,第一波答案会导致错误。我向那些已经以不同的借口回答的人道歉。
function doit(arr, obj, start){
if (Array.isArray(obj)) {
asdf.map((i, idx) => doit(arr, i, start + `${idx}.`))
} else if (typeof obj == 'object') {
Object.keys(obj).map(k => {
arr.push(start + `${k}`)
doit(arr, obj[k], start + `${k}.`)
})
}
}
然后只是a = []; obj = [your object]; doit(a, obj, ''); console.log(a)
这就像你的追求。
你的示例数据也有数组,所以我本来期望输出像 - > object.level1_prop4[0].level2_prop1
等,所以如果你取消注释相关的行,我也包括了那个。
const v =
{
"level1_prop1": "stuff",
"level1_prop2": 0,
"level1_prop3": 50,
"level1_prop4": [{
"level2_prop1": "more stuffs, and things",
"level2_prop2": "10000",
"level2_prop3": {
"level3_prop1": {
"level4_prop1": "other stuff",
"level4_prop1": "so much stuff",
},
"level3_prop2": null,
}
}, {
"level2_prop1": "still more and more",
"level2_prop2": "10001",
"level2_prop3": {
"level3_prop1": {
"level4_prop1": "other stuffssssss",
"level4_prop2": "so much stuffssssssss",
},
"level3_prop2": null,
}
}
]
};
function dotList(o) {
const s = new Set();
function dotIt(o, p = '') {
Object.entries(o).forEach(([k, v]) => {
if (typeof v === 'object' && v) {
if (Array.isArray(v)) {
v.forEach((v) => dotIt(v, `${p}${k}.`)); //if you also wanted the array [ix] bit too
//uncomment line below for array indexes key[v].key
//v.forEach((v, ix) => dotIt(v, `${p}${k}[${ix}].`));
} else dotIt(v, p + k + ".");
}
s.add(p + k);
});
}
dotIt(o, 'object.');
return Array.from(s);
}
dotList(v).forEach(e => console.log(e));
这将返回一个包含object的所有索引的数组。它还将包含嵌套的对象数组
function objectDeepKeys(obj){
return Object.keys(obj)
.filter(key => obj[key] instanceof Object)
.map(key => objectDeepKeys(obj[key]).map(k => `${key}.${k}`))
.reduce((x, y) => x.concat(y), Object.keys(obj))
}