提问人:TonyT 提问时间:6/9/2023 最后编辑:TonyT 更新时间:6/9/2023 访问量:31
如何使用 D3.js nest() 和 rollup() 控制退货顺序
How to control the return order using D3.js nest() and rollup()
问:
我在使用 D3.js .nest() 和 .rollup() 从我的数据数组中获取一致的返回/顺序时遇到了问题。当数组使用新名称或类似名称更新时,正确的数字帐户是正确的,但我无法设置从最近添加的名称到添加的姓氏的顺序。当添加新名称或添加另一个类似名称时,我会得到一个随机顺序。以下是我最近回报的一个例子。我寻求实现的顺序是从下到上显示的固定顺序(反向顺序);即 Field-8、Field-7、Field-6、Field-5......字段 1。我包含了一个代码示例。我希望这个建议请求是有道理的。我的回报如下:
[{
"num": 65,
"value": "Field-1"
}, {
"num": 64,
"value": "Field-8"
}, {
"num": 63,
"value": "Field-7"
}, {
"num": 62,
"value": "Field-7"
}, {
"num": 61,
"value": "Field-8"
}, {
"num": 60,
"value": "Field-6"
}, {
"num": 59,
"value": "Field-6"
}, {
"num": 58,
"value": "Field-7"
}, {
"num": 57,
"value": "Field-8"
}, {
"num": 56,
"value": "Field-5"
}, {
"num": 55,
"value": "Field-4"
}, {
"num": 54,
"value": "Field-4"
}, {
"num": 53,
"value": "Field-4"
}, {
"num": 52,
"value": "Field-5"
}, {
"num": 51,
"value": "Field-3"
}, {
"num": 50,
"value": "Field-5"
}, {
"num": 49,
"value": "Field-5"
}, {
"num": 48,
"value": "Field-1"
}, {
"num": 47,
"value": "Field-5"
}, {
"num": 46,
"value": "Field-4"
}, {
"num": 45,
"value": "Field-4"
}, {
"num": 44,
"value": "Field-1"
}, {
"num": 43,
"value": "Field-5"
}, {
"num": 42,
"value": "Field-5"
}, {
"num": 41,
"value": "Field-3"
}, {
"num": 40,
"value": "Field-1"
}, {
"num": 39,
"value": "Field-5"
}, {
"num": 38,
"value": "Field-5"
}, {
"num": 37,
"value": "Field-5"
}, {
"num": 36,
"value": "Field-5"
}, {
"num": 35,
"value": "Field-4"
}, {
"num": 34,
"value": "Field-1"
}, {
"num": 33,
"value": "Field-3"
}, {
"num": 32,
"value": "Field-2"
}, {
"num": 31,
"value": "Field-5"
}, {
"num": 30,
"value": "Field-1"
}, {
"num": 29,
"value": "Field-1"
}, {
"num": 28,
"value": "Field-1"
}, {
"num": 25,
"value": "Field-1"
}, {
"num": 24,
"value": "Field-2"
}, {
"num": 22,
"value": "Field-2"
}, {
"num": 21,
"value": "Field-1"
}, {
"num": 19,
"value": "Field-4"
}, {
"num": 17,
"value": "Field-3"
}, {
"num": 16,
"value": "Field-3"
}, {
"num": 15,
"value": "Field-1"
}, {
"num": 11,
"value": "Field-2"
}, {
"num": 10,
"value": "Field-3"
}]
$(function () {
var chartData=getListData("ViewsTest");
var data=[];
for(var i=0;i<chartData.length;i++){
data.push({"num":chartData[i].ID, "value":chartData[i].Views});
}
initChart(data);
});
function initChart(chartData){
data = chartData;
var baseCount = d3.nest()
.key(function(d) { return d.value; })
.rollup(function(v) { return v.length; })
.entries(data);
for(var i =1; i<= baseCount.length; i++){
$('.vCount').append($('<div/>', { id: 'r' + i, 'class' : 'ansbox'}))
}
var mainDiv = d3.select("body")
.attr("id", "main");
mainDiv.selectAll(".ansbox")
.data(baseCount)
.append("div")
.attr("class", function(d,i) { return "views"})
.html(function (d) { return d.key + " : " + d.values ; });
}
答:
1赞
Mark McClure
6/9/2023
#1
很高兴看到您的数据。不过,通常,将按照在数据中找到键的顺序生成键。例如,如果数据如下所示:d3.nest
let data = [
{ key: 2, value: "red" },
{ key: 1, value: "yellow" },
{ key: 2, value: "blue" }
]
然后你嵌套在 上,那么你会得到一个像key
[
{key: 2, values: ...},
{key: 1, values: ...}
]
当然,您可以随时对数组进行排序。下面是一个示例。
let data = [
{ key: 2, value: "red" },
{ key: 1, value: "yellow" },
{ key: 2, value: "blue" }
];
let nested = d3
.nest()
.key((o) => o.key)
.entries(data)
let div = d3.select('#v5')
div.append('h3').style('margin', '10px').text('Unsorted')
let table = div.append('table')
let head = table.append('tr')
head.append('th').text('Field')
head.append('th').text('Count')
nested.forEach(function(d) {
let tr = table.append('tr');
tr.append('td').text(`Field-${d.key}`)
tr.append('td').text(`${d.values.length}`)
});
div.append('h3').style('margin', '10px').text('Now sort')
nested.sort((a, b) => (a.key < b.key ? -1 : 1))
let table2 = div.append('table')
let head2 = table2.append('tr')
head2.append('th').text('Field')
head2.append('th').text('Count')
nested.forEach(function(d) {
let tr = table2.append('tr');
tr.append('td').text(`Field-${d.key}`)
tr.append('td').text(`${d.values.length}`)
})
table {
border-collapse: collapse;
}
th, td {
border-bottom: solid 1px black;
padding: 3px;
text-align: center;
}
th:first-child, td:first-child {
border-right: solid 1px black
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<div id="v5"></div>
说了这么多,值得一提的是,它已被弃用和删除,取而代之的是 和 。您可以查看 V6 迁移指南。d3.nest
d3.group
d3.rollup
评论
0赞
TonyT
6/9/2023
感谢您的回答,对于没有提供数据,我深表歉意。我更新了我的帖子以包含我的数据。我正在从 SharePoint 列表中提取数据。我会用你的答案更新我的代码,看看它是否对我有用。我稍后会回来报告。
0赞
TonyT
6/9/2023
完善!成功了。我做了一些小的调整,得到了我想要达到的最终结果。我还将回顾您提到的更新功能(d3.group 和 d3.rollup)。感谢您的指导。
评论