D3切片阵列从到值

  • 本文关键字:阵列 切片 D3 d3.js
  • 更新时间 :
  • 英文 :


我有一个类似于下面的数据集,

const data = [
    {frequency: 600, letter: 0, luminous: 234},
    {frequency: 2456, letter: 13, luminous: 4000},
    {frequency: 1200, letter: 2, luminous: 1402},
    {frequency: 1400, letter: 3, luminous: 1500},
    {frequency: 1234, letter: 4, luminous: 1800},
    {frequency: 768, letter: 5, luminous: 1900},
    {frequency: 3456, letter: 9, luminous: 2300},
    {frequency: 4567, letter: 10, luminous: 670},
    {frequency: 600, letter: 6, luminous: 2233},
    {frequency: 350, letter: 7, luminous: 1450},
    {frequency: 2340, letter: 8, luminous: 1470},
    {frequency: 4200, letter: 11, luminous: 5600},
    {frequency: 3000, letter: 12, luminous: 4500},
    {frequency: 1200, letter: 14, luminous: 4200},
    {frequency: 1100, letter: 15, luminous: 3000},
    {frequency: 1700, letter: 16, luminous: 4500},
];

,我需要将此数组数据从值和2值中切成d3

的2个值
const maxLetter = d3.max(data, d => d.letter);
const width = 400;
const scaleX = scaleLinear()
    .domain([0, maxLetter])
    .range([0, width])
    .clamp(true)

可以将我的data数组切成启动letter = 2以结束letter = 9作为新数组之间的所有内容吗?像下面的D3?

const newData = [
    {frequency: 1200, letter: 2, luminous: 1402},
    {frequency: 1400, letter: 3, luminous: 1500},
    {frequency: 1234, letter: 4, luminous: 1800},
    {frequency: 768, letter: 5, luminous: 1900},
    {frequency: 600, letter: 6, luminous: 2233},
    {frequency: 350, letter: 7, luminous: 1450},
    {frequency: 2340, letter: 8, luminous: 1470},
    {frequency: 3456, letter: 9, luminous: 2300}
];

为什么不使用简单的循环进行操作?这样:

var newData = [];
for(var i = 0; i < data.length; i++){
  if(data[i].letter >= 2 && data[i].letter < 10){
    newData.push(data[i]);
  }
}

要获得letter订购的newData数组,您可以使用一个比较器: newData.sort((a, b) => a.letter - b.letter)

要对数据执行操作, CrossFilter 是最好的解决方案。

  • 将数据输入CrossFilter
  • 基于键 [LETES]
  • 创建维度
  • 使用 filterRange 滤除数据

const data = [
    {frequency: 600, letter: 0, luminous: 234},
    {frequency: 2456, letter: 13, luminous: 4000},
    {frequency: 1200, letter: 2, luminous: 1402},
    {frequency: 1400, letter: 3, luminous: 1500},
    {frequency: 1234, letter: 4, luminous: 1800},
    {frequency: 768, letter: 5, luminous: 1900},
    {frequency: 3456, letter: 9, luminous: 2300},
    {frequency: 4567, letter: 10, luminous: 670},
    {frequency: 600, letter: 6, luminous: 2233},
    {frequency: 350, letter: 7, luminous: 1450},
    {frequency: 2340, letter: 8, luminous: 1470},
    {frequency: 4200, letter: 11, luminous: 5600},
    {frequency: 3000, letter: 12, luminous: 4500},
    {frequency: 1200, letter: 14, luminous: 4200},
    {frequency: 1100, letter: 15, luminous: 3000},
    {frequency: 1700, letter: 16, luminous: 4500},
];
const CFX = crossfilter(data);
const dimension = CFX.dimension(function (d){ return d.letter; });
console.dir(dimension.top(Infinity).length);
dimension.filterRange([2, 10]);
console.dir(dimension.top(Infinity));
console.dir(dimension.top(Infinity).length);
<script src="http://dc-js.github.io/dc.js/js/crossfilter.js"></script>

最新更新