javascript - 使用 d3.js 对多个字段进行分组

标签 javascript d3.js grouping nest

我尝试按 2 个字段 MessageGroupIdFlowId 对数据进行分组

(但我想要通用的方式,以防我必须对两个以上的字段进行分组)

我的数据

 [
  {
    "Id": 46489,
    "Message": "Hi",
    "MessageGroupId": 46488,
    "FlowId": 99
  },
  {
    "Id": 46492,
    "Message": "Hi User",
    "MessageGroupId": 46490,
    "FlowId": 100
  },
  {
    "Id": 46494,
    "Message": "Loan",
    "MessageGroupId": 46490,
    "FlowId": 101
  },
  {
    "Id": 46496,
    "Message": "Call",
    "MessageGroupId": 46490,
    "FlowId": 101
  }
]

所需输出

[
  {
    "MessageGroupId": 46488,
    "FlowId": 99,
    "values": [
      {
        "Id": 46489,
        "Message": "Hi",
        "MessageGroupId": 46488,
        "FlowId": 99
      }
    ]
  },
  {
    "MessageGroupId": 46490,
    "FlowId": 100,
    "values": [
      {
        "Id": 46492,
        "Message": "Hi User",
        "MessageGroupId": 46490,
        "FlowId": 100
      }
    ]
  },
  {
    "MessageGroupId": 46490,
    "FlowId": 101,
    "values": [
      {
        "Id": 46494,
        "Message": "Loan",
        "FlowId": 101,
        "MessageGroupId": 46490
      },
      {
        "Id": 46496,
        "Message": "Call",
        "FlowId": 101,
        "MessageGroupId": 46490
      }
    ]
  }
]

我知道 d3.nest 函数,但是当我尝试将它与多个键一起使用时

var nested_data = d3.nest()
.key(function(d) { return d.MessageGroupId; })
.key(function(d) { return d.FlowId; })
.entries(conversationData.Messages);

值相互嵌套

    [
  {
    "key": "46488",
    "values": [
      {
        "key": "99",
        "values": [
          {
            "Id": 46489,
            "Message": "Hi",
            "MessageGroupId": 46488,
            "FlowId": 99
          }
        ]
      }
    ]
  },
  {
    "key": "46490",
    "values": [
      {
        "key": "100",
        "values": [
          {
            "Id": 46492,
            "Message": "Hi User",
            "MessageGroupId": 46490,
            "FlowId": 100
          }
        ]
      },
      {
        "key": "101",
        "values": [
          {
            "Id": 46494,
            "Message": "Loan",
            "MessageGroupId": 46490,
            "FlowId": 101
          },
          {
            "Id": 46496,
            "Message": "Call",
            "MessageGroupId": 46490,
            "FlowId": 101
          }
        ]
      }
    ]
  }
]

如何才能达到预期的输出?

var data = [
      {
        "Id": 46489,
        "Message": "Hi",
        "MessageGroupId": 46488,
        "FlowId": 99
      },
      {
        "Id": 46492,
        "Message": "Hi User",
        "MessageGroupId": 46490,
        "FlowId": 100
      },
      {
        "Id": 46494,
        "Message": "Loan",
        "MessageGroupId": 46490,
        "FlowId": 101
      },
      {
        "Id": 46496,
        "Message": "Call",
        "MessageGroupId": 46490,
        "FlowId": 101
      }
    ]
    
    
 var nested_data = d3.nest()
    .key(function(d) { return d.MessageGroupId; })
    .key(function(d) { return d.FlowId; })
    .entries(data);

console.log(nested_data);
    
    
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

最佳答案

我自己实现了它,使用 native javascript

用法

arr.groupBy(['MessageGroupId','FlowId'])

来源

Array.prototype.groupBy = function (props) {
   var arr = this;
   var partialResult = {};

   arr.forEach(el=>{

       var grpObj = {};

       props.forEach(prop=>{
             grpObj[prop] = el[prop]
       });

       var key = JSON.stringify(grpObj);

       if(!partialResult[key]) partialResult[key] = [];

       partialResult[key].push(el);

   });

   var finalResult = Object.keys(partialResult).map(key=>{
      var keyObj = JSON.parse(key);
      keyObj.values = partialResult[key];
      return keyObj;
   })

   return finalResult;
}

片段

var arr = [{ "Id": 46489,
    "Message": "Hi",
    "MessageGroupId": 46488,
    "FlowId": 99
  },
  {
    "Id": 46492,
    "Message": "Hi User",
    "MessageGroupId": 46490,
    "FlowId": 100
  },
  {
    "Id": 46494,
    "Message": "Loan",
    "MessageGroupId": 46490,
    "FlowId": 101
  },
  {
    "Id": 46496,
    "Message": "Call",
    "MessageGroupId": 46490,
    "FlowId": 101
  }
]

Array.prototype.groupBy = function (props) {
   var arr = this;
   var partialResult = {};
   
   arr.forEach(el=>{
   
       var grpObj = {};
       
       props.forEach(prop=>{
             grpObj[prop] = el[prop]
       });
       
       var key = JSON.stringify(grpObj);
       
       if(!partialResult[key]) partialResult[key] = [];
       
       partialResult[key].push(el);
       
   });
   
   var finalResult = Object.keys(partialResult).map(key=>{
      var keyObj = JSON.parse(key);
      keyObj.values = partialResult[key];
      return keyObj;
   })
   
   return finalResult;
}


console.log(arr.groupBy(['MessageGroupId','FlowId']))

关于javascript - 使用 d3.js 对多个字段进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43973917/

相关文章:

python - 每年用 Pandas 绘制箱线图

list - 根据列表中的值对列表元素进行分组

javascript - Node js服务器。 http状态 - 404

javascript - 使用带有 2 个滚动条的 Scrollspy

javascript - 在 VS Code 中斜体化 JavaScript 的保留关键字

javascript - Tensorflow 给出回归问题的随机答案

javascript - D3 等分线功能无法正常工作

javascript - 当我单击标记时,不会出现弹出窗口。我收到以下错误

reactjs - 在 React/Redux 中更新 D3 Chart

php - 将平面数组拆分为包含输入数组中连续键值的分组子数组