使用linq.js从嵌套数组中选择不同的对象

时间:2016-04-07 09:29:52

标签: javascript linq.js

我们说我有以下数据,

data: {
    variations: [{
        steps: [
            { Name: "Crawl", Status: "Complete" },
            { Name: "Walk", Status: "InProgress" }
        ]
    },{
        steps: [
            { Name: "Crawl", Status: "Complete" },
            { Name: "Walk", Status: "Complete" },
            { Name: "Run", Status: "NotStarted" }
        ]
    }]
}

我如何使用linq.js获得这组数据?生成的数据集是所有变体的独特步骤。请注意,重复的抓取不在结果中。

[
    { Name: "Crawl", Status: "Complete" },
    { Name: "Walk", Status: "InProgress" },
    { Name: "Walk", Status: "Complete" },
    { Name: "Run", Status: "NotStarted" }
]

我尝试了很多Select和SelectMany的组合,但我没有运气。

2 个答案:

答案 0 :(得分:3)

首先,您需要压扁一系列步骤。一旦你有了这个,你就必须挑选出不同的步骤副本。由于您正在处理对象,因此您需要提供比较器。我只是将使其区别的属性组合成一个字符串。

var query = Enumerable.From(result.data.variations)
  .SelectMany("$.steps")
  .Distinct("[$.Name, $.Status].join(',')")
  .ToArray();

答案 1 :(得分:0)

如果您使用的是TypeScript,则有一个库可以在Typescript中提供强类型的可查询集合

集合是:

  • 列表
  • 字典

该库称为 ts-generic-collections 。 (Source code on GitHub

您可以得到如下不同的值:

it('distinct', () => {
    let numbers: number[] = [1, 2, 3, 1, 3];
    let list = new List(numbers);

    let distinct = list.distinct(new EqualityComparer());

    expect(distinct.length == 3);
    expect(distinct.elementAt(0) == 1);
    expect(distinct.elementAt(1) == 2);
    expect(distinct.elementAt(2) == 3);
});

class EqualityComparer implements IEqualityComparer<number> {
    equals(x: number, y: number) : boolean {
        return x == y;
    }
}