【问题标题】:How do I chain "SelectMany" calls with linqjs (or flatten JSON)如何使用 linqjs 链接“SelectMany”调用(或展平 JSON)
【发布时间】:2013-07-17 08:41:29
【问题描述】:

使用 linq.js 如何将两个 SelectMany 调用链接在一起。

鉴于以下 JSON 结构:

[
    {
        "UpFrontCost": "29.95",
        "Currency": "USDAUD",
        "FittingDate": "2013-07-08 06:30:16Z",
        "Widgets": [
            {
                "ID": 3,
                "Name": "Test1"
            },
            {
                "ID": 4,
                "Name": "Test19"
            },
            {
                "ID": 6,
                "Name": "Test8"
            }
        ]
    },
    {
        "UpFrontCost": "29.95",
        "Currency": "USDAUD",
        "FittingDate": "2013-07-08 06:30:16Z",
        "Widgets": [
            {
                "ID": 67,
                "Name": "Test1"
            },
            {
                "ID": 99,
                "Name": "Test19"
            },
            {
                "ID": 34,
                "Name": "Test8"
            }
        ]
    }
]

我想要一个所有“小部件”的列表(在本例中是 6 个小部件的列表)。

【问题讨论】:

    标签: javascript linq linq.js


    【解决方案1】:

    你不需要真正链接任何东西。您的根对象是一个数组,您只想为该数组中的每个对象选择每个小部件。

    var query = Enumerable.From(jsonObject)
        .SelectMany("$.Widgets") // Select each widget found in the Widgets property
        .ToArray();
    

    要展平将父对象的每个属性附加到结果的小部件数组,有几种方法可以做到。您可以使用函数语法使用嵌套查询。

    var query = Enumerable.From(jsonObject)
        .SelectMany(function (item) {
            return Enumerable.From(item.Widgets)
                .Select(function (widget) {
                    return {
                        ID: widget.ID,
                        Name: widget.Name,
                        UpFrontCost: item.UpFrontCost,
                        Currency: item.Currency,
                        FittingDate: item.FittingDate
                    };
                });
        })
        .ToArray();
    

    或者使用 lambda 字符串语法:

    var query = Enumerable.From(items)
        .SelectMany("$.Widgets",
            // argument 1 ($) - the parent object
            // argument 2 ($$) - the selected object (a widget)
            "{ ID: $$.ID, Name: $$.Name, UpFrontCost: $.UpFrontCost, Currency: $.Currency, FittingDate: $.FittingDate }"
        )
        .ToArray();
    

    【讨论】:

    • 谢谢杰夫。无论如何,我可以返回一个包含父级和子级属性的数组(每个子级在数组中的一行)?这是这个问题的实际用例,目前我正在使用两个 for 循环并手动将数据推送到数组来解决它。
    • 当然。您想包括哪些属性?编写选择器时,您可以将其编写为字符串或函数。以字符串形式编写时,您可以只使用普通的 javascript 语法。因此,您可以使用通常的对象初始化器语法创建对象。
    • 所以在我的示例中,我想返回一个数组,其中包含来自父对象的一些属性(对每个子项重复)和来自子对象的一些属性。本质上是扁平化整个数组,每个孩子一行。
    • 谢谢杰夫。选择语法正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2016-01-06
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多