【发布时间】:2014-05-14 07:35:28
【问题描述】:
看看下面的代码或者这个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]}"
]
【问题讨论】:
-
为什么输入数据一开始就这样格式化?你能接触到它的形成方式吗?
-
@Cerbrus:谢谢你的回复。你能否给我更多关于你所说的“为什么输入数据一开始就这样格式化?”的信息?你的意思是为什么数据的格式是 [XXX].[YYY].&[ZZZ] ??
-
这就是我的意思,是的。你能改变你接收数据的格式吗?另外,你到底想要什么样的结果?
-
@Cerbrus:我无法更改输入数据的格式。数据来自另一个服务(SSAS 多维数据集)。我在原始问题中添加了预期结果。我可以通过在第一个函数中使用两个函数来获得结果,我将通过 '.&' 分割值,在第二个函数中使用 '.'。
标签: javascript jquery underscore.js lodash