【问题标题】:Spliting values based on condition in JavaScript array根据 JavaScript 数组中的条件拆分值
【发布时间】: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


【解决方案1】:

我建议在 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 键。

【讨论】:

  • 感谢您的快速回复。这看起来不错。你能解释一下正则表达式是如何工作的吗?我了解其余部分,但不了解正则表达式在做什么。
  • @Brown_Dynamite:添加了解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2013-04-07
  • 2015-01-02
  • 1970-01-01
  • 2012-10-16
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多