d3.js 数据操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>d3 数据操作</title>
  <script src="https://d3js.org/d3.v5.min.js"></script>
  <style>
    #mainsvg {
      margin: 50px 200px;
    }
  </style>
</head>
<body>
  <!-- 
    https://blog.mn886.net/chenjianhua/show/773c07b3abce/index.html
    根据此问内容进行实操
   -->
   <p><a href="https://blog.mn886.net/chenjianhua/show/773c07b3abce/index.html" target="_blank">https://blog.mn886.net/chenjianhua/show/773c07b3abce/index.html</a>根据此问内容进行实操</p>
  <svg id="mainsvg" width="1000" height="600"></svg>

  <script>
    const svg = d3.select('#mainsvg')
    const width = +svg.attr('width')
    const height = +svg.attr('height')
    const margin = {left: 200, top: 50, right: 50, bottom: 50}
    const innerWidth = width - margin.left - margin.right
    const innerHeight = height - margin.top - margin.bottom

    let data = [3, 2, 3, 6, 7, 1, 4, 5]
    let data1 = [
      {
        num: 2,
        name: '11'
      },
      {
        num: 5,
        name: '1'
      },
      {
        num: 1,
        name: '2'
      },
      {
        num: 3,
        name: '5'
      },
    ]
    
    data.sort(d3.ascending)
    console.log('升序排序函数:', data)


    data.sort(d3.descending)
    console.log('降序排序函数:', data)


    let max = d3.max(data)
    console.log('数组中最大值:', max)

    let min = d3.min(data)
    console.log('数组中最小值:', min)

    let range = d3.extent(data) // 返回数组
    console.log('获取数组范围(最小值和最大值):', range)

    let sum = d3.sum(data)
    console.log('获取数组中数字总和:', sum)
    
    let mean = d3.mean(data)
    console.log('获取数组中数字的算术平均值:', mean)
        
    let median = d3.median(data)
    console.log('获取数组中数字的中位数 (相当于 0.5-quantile的值):', median)
    
    const purples = [
      'purple1',
      'purple2',
      'purple3',
      'purple4',
      'purple5'
    ]
    const dataset = [1, 1, 1, 1, 2, 3, 4]

    const bisect = d3.bisect(dataset, 1);
    console.log('用來尋找某值對應一個陣列資料內的正確位置或最接近的位置:', bisect);

    
    const bisectRight = d3.bisectRight(dataset, 1);
    console.log('可以找出1插入的話,並插入資料源的右側,會位於第3個:', bisectRight);

    const bisectLeft = d3.bisectLeft(dataset, 1);
    console.log('可以找出1插入的話,並插入資料源的左側,會位於第1個。:', bisectLeft);

    d3.shuffle(data)
    console.log('随机排序:', data)

    d3.permute(data, 2)
    console.log('以指定顺序排列数组中的元素:', data)


    let data2 = d3.zip(data, dataset)
    console.log('将多个数组合并成一个数组的数组,新数组的的第i个元素是原来各个数组中第i个元素组成的数组:', data2)

    
    
    let data3 = d3.transpose(d3.zip(data, dataset))
    console.log('矩阵转置,通过d3.zip实现:', data3)

    
    let data4 = d3.pairs(data)
    console.log('返回临近元素对的数组:', data4)

    
    let data5 = d3.keys(data)
    console.log('返回关联数组(哈希表、json、object对象)的key组成的数组:', data5)

    
    let data6 = d3.values(data)
    console.log('返回关联数组(哈希表、json、object对象)的value组成的数组:', data6)
    
    let data9 = d3.entries({foo: 11})
    console.log('返回关联数组的key-value实体组成的数组:', data9)
    
    let data7 = d3.merge([[1,2], [8]])
    console.log('将多个数组连成一个:', data7)
    
    let data8 = d3.range(1,8)
    console.log('获得一个数列:', data8)

    
    let data10 = d3.nest().key(d => d).entries(data)
    console.log('获得一个nest对象,将数组组织成层级结构:', data10)
    // nest.key 为nest层级结构增加一个层级.
    // nest.sortKeys 将当前的nest层级结构按key排序
    // nest.sortValues 将叶nest层级按value排序
    // nest.rollup  设置修改叶节点值的函数
    // nest.map 执行nest操作, 返回一个关联数组(json)
    // nest.entries 执行nest操作, 返回一个key-value数组. 如果nest.map返回的结果类似于{ foo: 42 }, 则nest.entries返回的结果类似于[{key: "foo", value: 42}]
    let data11 = d3.nest().map(data)
    console.log('sortKeys--map', data11)
    let data12 = d3.nest().entries(data)
    console.log('sortKeys--entries', data12)
    
    // 将javascript的object转化为hash,屏蔽了object的原型链功能导致的与hash不一致的问题。

    // map有某个key就返回true.
    let data13 = d3.map({a: 5}).has('a')
    console.log('map-has', data13)
    
    // 返回map中某个key对应的value.
    let data14 = d3.map({a: 5}).get('a')
    console.log('map-get', data14)
    
    // 设置map中某个key对应的value.
    let data15 = d3.map({a: 5}).set('b', 7)
    console.log('map-set', data15)
    
    // 删除map中的某个key.
    let temp1 = {a: 5,c:2}
    let data16 = d3.map(temp1).remove('a')
    console.log('map-remove', data16, temp1)

    // 返回map中所有entry(key-value键值对)组成的数组
    let data17 = d3.map(temp1).entries()
    console.log('map-entries', data17)

    // 对map中每一个entry执行某个函数.
    d3.map(temp1).entries().forEach(d => {console.log('map-forEach:',d);})
    console.log(temp1)

    // 返回map中所有key组成的数组.
    let data18 = d3.map(temp1).keys()
    console.log('map-keys', data18)
    
    // 返回map中所有value组成的数组.
    let data19 = d3.map(temp1).values()
    console.log('map-keys', data19)

    // d3.set
    // 将javascript的array转化为set,屏蔽了array的object原型链功能导致的与set不一致的问题。set中的value是array中每个值转换成字符串的结果。set中的value是去重过的。
    let temp2 = [2, 7, 8, 3, 4, 5, 2, 3, 8, 7]
    // 返回set中是否含有某个value.
    let data20 = d3.set(temp2).has(2)
    console.log('set-has', data20, temp2)

    // 添加某个value.
    let data21 = d3.set(temp2).add(9)
    console.log('set-add', data21, temp2)
    
    // 删除某个value.
    let data22 = d3.set(temp2).remove(2)
    console.log('set-remove', data22, temp2)
    
    // 返回set中的值组成的数组.set中的value是去重过的.
    let data23 = d3.set(temp2).values()
    console.log('set-values', data23, temp2)
    
    
  </script>
</body>
</html>

d3常用数据处理方法

原文地址:https://www.cnblogs.com/wlgwilianm123/p/14144635.html