linq.js 学习

linq.js中GroupBy

 

GroupBy: function (keySelector, elementSelector, resultSelector, compareSelector)
        {
            var source = this;
            keySelector = Utils.CreateLambda(keySelector);
            elementSelector = Utils.CreateLambda(elementSelector);
            if (resultSelector != null) resultSelector = Utils.CreateLambda(resultSelector);
            compareSelector = Utils.CreateLambda(compareSelector);

            return new Enumerable(function ()
            {
                var enumerator;

                return new IEnumerator(
                    function ()
                    {
                        enumerator = source.ToLookup(keySelector, elementSelector, compareSelector)
                            .ToEnumerable()
                            .GetEnumerator();
                    },
                    function ()
                    {
                        while (enumerator.MoveNext())
                        {
                            return (resultSelector == null)
                                ? this.Yield(enumerator.Current())
                                : this.Yield(resultSelector(enumerator.Current().Key(), enumerator.Current()));
                        }
                        return false;
                    },
                    function () { Utils.Dispose(enumerator); })
            });
        },

测试代码:

 

module("Grouping");

var expected, actual; // will be removed

var fileList = ["temp.xls", "temp2.xls", "temp.pdf", "temp.jpg", "temp2.pdf", "temp3.xls"];

test("groupBy", function ()
{
    actual = Enumerable.from(fileList)
        .groupBy("file=>file.match(/\\.(.+$)/)[1]") 
        .select("{key:$.key(),value:$.toArray()}")
        .toArray();
    expected = [{ key: "xls", value: ["temp.xls", "temp2.xls", "temp3.xls"] },
                { key: "pdf", value: ["temp.pdf", "temp2.pdf"] },
                { key: "jpg", value: ["temp.jpg"]}];
    deepEqual(actual, expected);

    actual = Enumerable.from(fileList)
        .groupBy("file=>file.match(/\\.(.+$)/)[1]", "file=>file.match(/(^.+)\\..+$/)[1]")
        .select("{key:$.key(),value:$.toArray()}")
        .toArray();
    expected = [{ key: "xls", value: ["temp", "temp2", "temp3"] },
                { key: "pdf", value: ["temp", "temp2"] },
                { key: "jpg", value: ["temp"]}];
    deepEqual(actual, expected);

    actual = Enumerable.from(fileList).groupBy("file=>file.match(/\\.(.+$)/)[1]",
        "file=>file",
        "ext,group => {extension:ext,count:group.count(),files:group.toArray()}")
        .toArray();
    expected = [{ extension: "xls", count: 3, files: ["temp.xls", "temp2.xls", "temp3.xls"] },
                { extension: "pdf", count: 2, files: ["temp.pdf", "temp2.pdf"] },
                { extension: "jpg", count: 1, files: ["temp.jpg"]}];
    deepEqual(actual, expected);

    var objects = [
        { Date: new Date(2000, 1, 1), Id: 1 },
        { Date: new Date(2010, 5, 5), Id: 2 },
        { Date: new Date(2000, 1, 1), Id: 3 }
    ]
    var actual = Enumerable.from(objects)
        .groupBy("$.Date", "$.Id",
            function (key, group) { return key.getFullYear() + "-" + group.toJoinedString(',') },
            function (key) { return key.toString() })
        .toArray();
    expected = ["2000-1,3", "2010-2"]
    deepEqual(actual, expected);
});

注:此处正则表达式中转义用两个斜杠 \\ 表示,用括号括起来的正则表达式匹配到的字符会单独提取出来返回。

正则中( )的作用:

(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

 

"temp.xls".match(/\.(.+$)/) ——》结果:[".xls", "xls"]

"temp.xls".match(/(^.+)\..+$/)——》结果:["temp.xls", "temp"]

 

GroupBy四个参数的解释:

keySelector:键选择器,选出来的键作为groupby分组的依据。

elementSelector:值选择器

resultSelector:返回的结果选择器

compareSelector:比较对象选择器,定义keySelector选出来的键中groupby分组比较的方式

posted @ 2015-11-09 15:10  在树上唱歌  阅读(369)  评论(0)    收藏  举报