按顺序中不同值的列表拆分Javascript数组中的每个值&;然后把他们分组

按顺序中不同值的列表拆分Javascript数组中的每个值&;然后把他们分组,javascript,jquery,underscore.js,handlebars.js,lodash,Javascript,Jquery,Underscore.js,Handlebars.js,Lodash,我有一个Javascript数组。我想根据某个值拆分数组中的每个值,然后将它们分组 以下是按优先级排序的条件/值,我希望根据这些条件/值在数组中拆分值 &第一次按拆分& [All]如果未找到&,则基于[All] 如果未找到基于的拆分的&和[All] 然后我需要将所有按,分组的值连接在一起 我能做到这一切&这里有一个同样的例子 问题:现在我想按下面提到的顺序拆分以下值 & [All].UNKNOWNMEMBER--新添加的条件 [全部] 我附带的小提琴显示以下输出: { [Dim1].[Att]

我有一个Javascript数组。我想根据某个值拆分数组中的每个值,然后将它们分组

以下是按优先级排序的条件/值,我希望根据这些条件/值在数组中拆分值

  • &
    第一次按
    拆分&
  • [All]
    如果未找到
    &
    ,则基于
    [All]
  • 如果未找到基于
    的拆分的
    &
    [All]
  • 然后我需要将所有按
    分组的值连接在一起

    我能做到这一切&这里有一个同样的例子

    问题:现在我想按下面提到的顺序拆分以下值

  • &
  • [All].UNKNOWNMEMBER
    --新添加的条件
  • [全部]
  • 我附带的小提琴显示以下输出:

    { [Dim1].[Att].&[001], [Dim1].[Att].&[002] } * { [Dim1].[Att].[All].UNKNOWNMEMBER } * { [Dim3].[Att].[All].Children } * { [Dim4].[Att].[All].Children } * { [M1].[One], [M1].[Two] }
    
    我希望将输出更改为

    { [Dim1].[Att].&[001], [Dim1].[Att].&[002] , [Dim1].[Att].[All].UNKNOWNMEMBER } * { [Dim3].[Att].[All].Children } * { [Dim4].[Att].[All].Children } * { [M1].[One], [M1].[Two] }
    
    当前,当我通过
    &
    拆分
    [Dim1].[Att].&[001]
    时,我得到
    [Dim1].[Att].&
    ,但是如果我们在拆分操作后将输出更改为
    [Dim1].[Att]
    ,如下图所示,我将得到所需的结果


    我不想使用for循环来获得所需的结果。

    如果您想加入
    [All].unknown成员
    &
    组中,那么您可以在
    groupBy()
    函数中替换此文本?例如:

    var res = _.chain(selectionList)
        .groupBy(function (x) {
        return x.replace("\.\[All\]\.UNKNOWNMEMBER",".&")
                .match(/.+?\.&|.+?\.\[All\]|[^.]+\./i)[0];
    })
    
    如果您希望数组中的元素也被排序(因此在
    未知成员
    元素之前有
    &
    元素,您可以将其添加到
    映射()
    函数中:

        .map(function (x) {
    
        return "{ " + x.sort().join(", ") + " }";
    })
    
    小提琴演示:

    排序和映射 您可以通过自定义排序获得所需的输出,该排序根据拆分条件创建列组

    资料来源:

    var s = [
        "[Dim1].[Att].&[001]",
        "[Dim1].[Att].[All].UNKNOWNMEMBER",
        "[Dim1].[Att].&[002]",
        "[Dim3].[Att].[All].Children",
        "[Dim4].[Att].[All].Children",
        "[M1].[One]",
        "[M1].[Two]"];
    
    // Sort the items.
    s.sort(function(a,b){
    
      // Give items a rank based on what we find. 1 is high, 10 is low.
      var x = a.indexOf(".&") > -1 ? 0 : 10;
      if (x === 10) x = a.indexOf(".[All].UNKNOWNMEMBER") > -1 ? 1 : 10;
      if (x === 10) x = a.indexOf(".[All]") > -1 ? 2 : 10;
      if (x === 10) x = a.indexOf(".") > -1 ? 3 : 10;
    
      var y = b.indexOf(".&") > -1 ? 0 : 10;
      if (y === 10) y = b.indexOf(".[All].UNKNOWNMEMBER") > -1 ? 1 : 10;
      if (y === 10) y = b.indexOf(".[All]") > -1 ? 2 : 10;
      if (y === 10) y = b.indexOf(".") > -1 ? 3 : 10;
    
      // Sort according to rank.
      if (x > y) {
        return 1;
      } else if (x === y) {
        return 0;
      } else {
        return -1;
      }
    
    });
    
    
    console.log(s);
    
    // Create output for the groups.
    var output = "{";
    var key = "";
    
    s.map(function(item){
    
      var thisKey = item.substr(0, item.indexOf(".")-1);
    
      if (thisKey !== key) {
        if (key !== "") output += "} * ";
        output += "{ ";
        key = thisKey;
      } else {
        output += " , "
      }
    
      output += item;
    });
    
    output += " }";
    
    console.log(output);
    
    输出:

     ["[Dim1].[Att].&[001]", "[Dim1].[Att].&[002]", "[Dim1].[Att].[All].UNKNOWNMEMBER", "[Dim3].[Att].[All].Children", "[Dim4].[Att].[All].Children", "[M1].[One]", "[M1].[Two]"]
    
    {{ [Dim1].[Att].&[001] , [Dim1].[Att].&[002] , [Dim1].[Att].[All].UNKNOWNMEMBER} * { [Dim3].[Att].[All].Children} * { [Dim4].[Att].[All].Children} * { [M1].[One] , [M1].[Two] }
    

    您好,我们需要更全面地了解这个问题。到目前为止,原始数据似乎应该正常化。@moonwave99:我已经更新了这个问题。我希望它能有所帮助。如果您有任何具体问题,请告诉我