根据JavaScript数组中的条件分割值

时间:2014-05-14 07:35:28

标签: javascript jquery underscore.js lodash

请查看以下代码或此fiddle

var arr = ["[Dim1].[Mem1].&[1]",
           "[Dim2].[Mem1].&[2]",
           "[Dim1].[Mem1].&[5]",
           "[Dim2].[Mem1].&[77]",
           "[Dim2].[Mem1].[All].Child",
           "[Dim3].[Mem1].&[1]"];

var res = _.chain(arr)
    .invoke("split", ".&")
    .groupBy(0)
    .map(function (els) {
        return "{ " + _.invoke(els, "join", ".&").join(", ") + " }";
    })
    .value();

console.log(res);

会产生以下输出:

[
"{ [Dim1].[Mem1].&[1], [Dim1].[Mem1].&[5] }", 
"{ [Dim2].[Mem1].&[2], [Dim2].[Mem1].&[77] }", 
"{ [Dim2].[Mem1].[All].Child }", 
"{ [Dim3].[Mem1].&[1] }"
]

上面的代码使用的是lodash库。它查看数组并将值除以'.&',然后按结果数组的第零个索引对数据进行分组。

这段代码工作正常,它正在做什么。

现在考虑输入数组中没有'.&'的情况。在这种情况下,我想将输入分割为'.',然后对值进行分组。是否可以通过修改上面的代码来实现所需的结果?或者是否可以根据输入值进行条件分割?

var arrTwo = ["[Dim1].[Mem1].&[1]",
              "[Dim2].[Mem1].&[2]",
              "[Dim1].[Mem1].&[5]",
              "[Dim2].[Mem1].&[77]",
              "[Measures].[M11]",
              "[Dim2].[Mem1].[All].Child",
              "[Dim3].[Mem1].&[1]"],
              "[Measures].[M1]",
              "[Measures].[M2]";

预期输出:

[

"{ [Dim1].[Mem1].&[1], [Dim1].[Mem1].&[5] }" , 
"{ [Dim2].[Mem1].&[2], [Dim2].[Mem1].&[77] }", 
"{ [Dim2].[Mem1].[All].Child }", 
"{ [Dim3].[Mem1].&[1] }",
"{[Measures].[M11], [Measures].[M1], [Measures].[M2]}"
]

1 个答案:

答案 0 :(得分:2)

我建议在groupBy回调中使用正则表达式而不是split

var res = _.chain(arrTwo)
    .groupBy(function(x) {
        return x.match(/.+?\.&|[^.]+\./)[0]
    })
    .map(function (x) {
        return "{ " + x.join(", ") + " }";
    })
    .value();

这似乎产生了预期的结果:http://jsfiddle.net/aAy6L/2/

该正则表达式首先尝试匹配所有内容,包括.&。如果它失败(即字符串中没有.&),它会回溯并尝试匹配"一些非点和一个点"。找到的匹配项用作groupBy密钥。