请查看以下代码或此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]}"
]
答案 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
密钥。