我有一个类似于下面的数据集,
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>