Javascript 我如何连锁;选择多个“;使用linqjs(或展平JSON)调用

Javascript 我如何连锁;选择多个“;使用linqjs(或展平JSON)调用,javascript,linq,linq.js,Javascript,Linq,Linq.js,使用linq.js如何将两个SelectMany调用链接在一起 给定以下JSON结构: [ { "UpFrontCost": "29.95", "Currency": "USDAUD", "FittingDate": "2013-07-08 06:30:16Z", "Widgets": [ { "ID": 3, "Name": "Test

使用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个小部件的列表)。

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

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语法。因此,您可以使用常用的对象初始值设定项语法创建一个对象。因此,在我的示例中,我想返回一个数组,其中包含父对象的一些属性(对每个子项重复)和子对象的一些属性。基本上是整平整个阵列,每个孩子一行。谢谢杰夫。选择语法正是我想要的。