【问题标题】:How to iterate array with objects with DW v1.0如何使用 DW v1.0 使用对象迭代数组
【发布时间】:2021-03-02 20:17:38
【问题描述】:

我已经有了对象的这个答案,但正在寻找一种方法来改进它以便能够使用相同对象类型的数组:

%dw 1.0
%output application/json

%function filterKeys(o, k)
    o mapObject
            { 
                ($$): 
                    $ when ($ is :string and not (k contains ($$ as :string)))
                    otherwise orderMembers($, k)
            } 
            orderBy $$

%function splitString(s) s splitBy "," map trim $

%function orderMembers(x, k)
    x match {
        a is :array -> a orderBy $,
        o is :object -> filterKeys(o, k),
        s is :string -> orderMembers(splitString(s), k)
             when s  contains ',' otherwise s,
        default -> $
    }
    
%var testData={ccc:"333", ddd: ["555", "333", "222"], bbb: "223,221,222", eee: "456, 789, 123", aaa: 11}
---
orderMembers(testData, ["bbb"]) 

如何修改它以使其可以与该数据样本一起使用:

%var testData=[{ccc:"333", ddd: ["555", "333", "222"], bbb: "223,221,222", eee: "456, 789, 123", aaa: 11}, {ccc:"333", ddd: ["555", "333", "222"], bbb: "223,221,222", eee: "456, 789, 123", aaa: 11}]

【问题讨论】:

  • orderMember 函数不是已经按预期工作了吗?
  • 请解释使用该输入数据时的问题和预期结果。
  • 它的工作然后输入是对象 {} 但随后它作为对象数组出现 [{},{},{}] 它的放置错误无法比较 ::object

标签: mule dataweave mule-esb


【解决方案1】:

我会做出有根据的猜测,orderBy() 会抛出错误 You cannot compare a value of type ::object.,因为它试图对对象数组进行排序,而不是对原本预期的数组类型的字符串进行排序。

一个简单但不完整的解决方案是在尝试对数组进行排序之前检查数组的第一个元素是否为字符串。如果不是,我们可以假设它是对象并递归处理它们。这可以改进,检查对象,检查数组中所有元素的类型等。我将把它作为练习给读者。

简单的解决方法是改变:

     a is :array -> a orderBy $,

通过

     a is :array -> (a orderBy $) 
           when (a[0] is :string) 
           otherwise (a map orderMembers($, k)),

您可以改进when 条件,例如检查数组中的所有元素是否属于兼容类型。我觉得这在 Mule 4 中会更容易,因为 DataWeave 2.0 有很多有用的函数来实现对数组和对象的测试。

【讨论】:

  • o 行中发生的问题是 :object - 仅限于使用旧版本,因为它安装在服务器上,公司不想投资升级,直到它工作,所以我仅限于版本 1.0 :(
猜你喜欢
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多