开发者问题收集

如何以点符号形式打印出 javascript/Google Apps Script(GAS)中深度未知的数组的所有对象属性

2019-04-01
839

作为使用 Google Apps Script (GAS) 为 Google Sheet 开发自定义函数的一部分,我试图获取对象属性(键?)名称的扁平树。我对任何值都不感兴趣,我只想打印出所有对象属性(键)名称的点符号树。该对象的深度和结构未知。

示例:

{
    "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 Script (GAS) 函数,因为当我将第一波答案粘贴到我的 code.gs 文件中时会导致错误。我向那些已经以不同借口回答的人道歉。

3个回答

这将返回一个包含对象所有索引的数组。它还将 包括对象的嵌套数组

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))
}

取自 https://stackoverflow.com/a/47514598/11294419

Tadeo Hndz
2019-04-02
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 = [你的对象]; doit(a, obj, ''); console.log(a)

severestrength
2019-04-01

这与您之后一样。

您的示例数据也有数组,因此我希望像 - &gt一样输出。 object.level1_prop4 [0] .level2_prop1 等,因此,如果您取消相关行,我也包括一个。

240549154
Keith
2019-04-01