前端桑基图数据处理

444 阅读1分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

Echarts在线地址 :

echarts.apache.org/examples/zh…

预览效果:

image.png

代码预览:

<!--
    THIS EXAMPLE WAS DOWNLOADED FROM https://echarts.apache.org/examples/zh/editor.html?c=sankey-simple
-->
<!DOCTYPE html>
<html style="height: 100%">

<head>
  <meta charset="utf-8">
</head>

<body style="height: 100%; margin: 0">
  <div id="container" style="height: 100%"></div>


  <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.3.0/dist/echarts.min.js"></script>
  <!-- Uncomment this line if you want to dataTool extension
        <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.3.0/dist/extension/dataTool.min.js"></script>
        -->
  <!-- Uncomment this line if you want to use gl extension
        <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js"></script>
        -->
  <!-- Uncomment this line if you want to echarts-stat extension
        <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js"></script>
        -->
  <!-- Uncomment this line if you want to use map
        <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.3.0/map/js/china.js"></script>
        <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.3.0/map/js/world.js"></script>
        -->
  <!-- Uncomment these two lines if you want to use bmap extension
        <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=<Your Key Here>"></script>
        <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@{{version}}/dist/extension/bmap.min.js"></script>
        -->

  <script type="text/javascript">
    var dom = document.getElementById("container");
    var myChart = echarts.init(dom);
    var app = {};

    var option;



    option = {
      series: {
        type: 'sankey',
        layout: 'none',
        emphasis: {
          focus: 'adjacency'
        },
        data: [{
            name: '男'
          },
          {
            name: '华为'
          },
          {
            name: '苹果'
          },
          {
            name: '小米'
          },
          {
            name: 'OPPO'
          },
          {
            name: 'vivo'
          },
          {
            name: '女'
          }
        ],
        links: [{
            source: '女',
            target: 'OPPO',
            value: 3
          },
          {
            source: '男',
            target: '华为',
            value: 5
          },
          {
            source: '男',
            target: '小米',
            value: 3
          },
          {
            source: '男',
            target: '苹果',
            value: 5
          },
          {
            source: '女',
            target: '小米',
            value: 5
          },
          {
            source: '男',
            target: 'OPPO',
            value: 2
          },

          {
            source: '女',
            target: '苹果',
            value: 10
          },
          {
            source: '女',
            target: '华为',
            value: 4
          },


        ]
      }
    };


    if (option && typeof option === 'object') {
      myChart.setOption(option);
    }


    
  </script>
</body>

</html>

需要处理的数据:

links: [{
            source: '女',
            target: 'OPPO',
            value: 3
          },
          {
            source: '男',
            target: '华为',
            value: 5
          },
          {
            source: '男',
            target: '小米',
            value: 3
          },
          {
            source: '男',
            target: '苹果',
            value: 5
          },
          {
            source: '女',
            target: '小米',
            value: 5
          },
          {
            source: '男',
            target: 'OPPO',
            value: 2
          },

          {
            source: '女',
            target: '苹果',
            value: 10
          },
          {
            source: '女',
            target: '华为',
            value: 4
          },


        ]

想要的效果:

        data: [{
            name: '男'
          },
          {
            name: '华为'
          },
          {
            name: '苹果'
          },
          {
            name: '小米'
          },
          {
            name: 'OPPO'
          },
          {
            name: 'vivo'
          },
          {
            name: '女'
          }
        ],

处理方法:

  const tempData = linksList.map(item => {
            console.log(item);
            const result = [
                {
                    name:item["source"]
                },
                {
                    name:item["target"]
                }
            ]
            return result
        })
        console.log(tempData);// 二维数组:【【{name: "女"}, {name: "OPPO"}】,【{name: "女"}, {name: "OPPO"}】】
       console.log(tempData.flat());//[{name: "女"}, {name: "OPPO"}]

        //对象数组去重
       const   unique = (arr) => {
           const res = new Map()
           return arr.filter(arrItem => !res.has(arrItem.name) && res.set(arrItem.name,1))
       }

       const data = unique(tempData.flat(),'name')
       console.log("finally",data);

image.png