我们说我有以下数据,
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的组合,但我没有运气。
答案 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;
}
}