【问题标题】:DataWeave - Get array of keys from nested ObjectDataWeave - 从嵌套对象中获取键数组
【发布时间】:2021-09-08 17:08:39
【问题描述】:

我正在尝试提出一个 DataWeave 2.0 函数,它接收 Any 类型的值并返回一个包含输入值的所有键的数组:deepKeys(e: Any, keys: Array = []): Array<Key>

几个例子:

  • deepKeys({hello: "hi", goodbye: "bye"}) 返回["hello", "goodbye"]
  • deepKeys("hi") 返回[]
  • deepKeys(null) 返回[]
  • deepKeys({key1: "1", key2: {key3: "3"}}) 返回["key1", "key2", "key3"]
  • deepKeys([{key1: "1"}, {key1: "2"}, {key1: "3"}]) 返回["key1", "key1", "key1"]

我会发布一些我尝试过的东西,但我认为它们中的任何一个都没有走上正轨。

【问题讨论】:

    标签: dataweave mulesoft


    【解决方案1】:

    这里有一些适用于您的用例的代码。我敢肯定它会更漂亮:D

    %dw 2.0
    output application/json
    fun getNestedValues(size: Number, e: Object | Array, keys: Array): Array = do {
        var newSize = size - 1
        ---
        if (newSize >= 0) (
            ((0 to newSize) as Array) reduce ((indx, acc=[]) -> (
                acc ++ deepKeys(e[indx], keys)
            ))
        ) else []
    }
    fun deepKeys (e: Any, keys: Array = []) = (
        e match {
            case is Object -> do {
                var thisKeys = keysOf(e)
                ---
                keys ++ thisKeys ++ getNestedValues(sizeOf(thisKeys), e, keys)
            }
            case is Array -> 
                getNestedValues(sizeOf(e), e, keys)
            else -> keys
        }
    )
    ---
    {
        t1: deepKeys({hello: "hi", goodbye: "bye"}),
        t2: deepKeys("hi"),
        t3: deepKeys(null),
        t4: deepKeys({key1: "1", key2: {key3: "3"}}),
        t5: deepKeys([{key1: "1"}, {key1: "2"}, {key1: "3"}]),
        t6: deepKeys([{key1: 1, key2: 2, key3: {key4: {key5: 5}}}])
    }
    

    【讨论】:

    • 嗨亚历山德拉,你能在答案文本中添加更多关于你的代码的解释吗?这将使它成为一个更好的答案。
    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    【解决方案2】:
    %dw 2.0
    output application/json
    fun deepKeys(value: Any, keys = []): Array<String> | Null = do {
        flatten([keys, 
        typeOf(value) as String match {
            case "Object" -> keysOf(value) reduce (v0, a0 = flatten([keys, keysOf(value)])) -> flatten([a0, deepKeys(value[v0], keys)])
            case "Array" -> value reduce (v1, a1 = []) -> flatten([a1, deepKeys(v1, keys)])
            else -> []
        }])
    }
    ---
    {
        t1: deepKeys({hello: "hi", goodbye: "bye"}),
        t2: deepKeys("hi"),
        t3: deepKeys(null),
        t4: deepKeys({key1: "1", key2: {key3: "3"}}),
        t5: deepKeys([{key1: "1"}, {key1: "2"}, {key1: "3"}]),
        t6: deepKeys([{key1: 1, key2: 2, key3: {key4: {key5: 5}}}])
    }
    

    【讨论】:

    • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 2019-09-26
    • 2021-11-29
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多