gpt4 book ai didi

javascript - 嵌套数据中的 D3 v4 更新,最佳方式

转载 作者:行者123 更新时间:2023-11-29 20:54:09 25 4
gpt4 key购买 nike

我有下面的代码,它足够简单来更新嵌套数据模型,但是 text(null) 部分看起来有点奇怪。

我不确定我做的是否正确或有更好的方法:

var data = [
{key: 1, values:[1, 2, 3]},
{key: 2, values:[3, 4, 5]},
]

function update(data) {
var table = d3.select('#gogo')
var tr = table.selectAll('tr')
.data(data)
.text(null)

var rowEnter = tr.enter().append('tr')

var td = tr.merge(rowEnter).selectAll("td")
.data(d=>d.values)
.text(d=>d)

cellEnter = td.enter().append("td")
cellEnter.append("span")
.text(d=>d)
}

update(data)
ref()
function ref() {
setInterval(()=>{
data.map(item=> {
for (var i=0; i<3; i++) {
item.values[i] = Math.floor(Math.random() * 100) + 1
}
})
console.log(data)
update(data)
}, 1000)
}

基本上它只是呈现以下 html 代码:

<table id="gogo"><tr><td><span>1</span></td><td><span>2</span></td><td><span>3</span></td></tr><tr><td><span>3</span></td><td><span>4</span></td><td><span>5</span></td></tr></table>

请有人给我建议。

最佳答案

你是对的,有更好的方法。现在你的代码很困惑,它有一些没有意义的东西(比如 text(null)),最重要的是,它不能为任何不同数量的行和单元格更新表格。 .. 这是更新选择的最重要特征。

这是我对您的更新功能的建议:

function update(data) {
var table = d3.select('#gogo');

var tr = table.selectAll('tr')
.data(data);

var rowExit = tr.exit().remove();

var rowEnter = tr.enter().append('tr');

tr = rowEnter.merge(tr);

var td = tr.selectAll("td")
.data(d => d.values);

var cellExit = td.exit().remove();

var cellEnter = td.enter().append("td").append("span");

td = cellEnter.merge(td)
.text(d => d)
}

让我们逐行查看。

一、表的选择:

  var table = d3.select('#gogo');

基于该选择,我们将为行创建更新选择:

  var tr = table.selectAll('tr')
.data(data);

然后,根据该更新选择,我们为行创建输入选择:

  var rowEnter = tr.enter().append('tr');

之后,我们合并行的输入和更新选择:

  tr = rowEnter.merge(tr);

这允许我们拥有任意数量的行。当然,要有真正的更新功能,我们还得设置退出选择:

var rowExit = tr.exit().remove();

然后,对于下一层,也就是细胞,我们做几乎相同的事情,更新、退出和使用 merge 进入选择:

var td = tr.selectAll("td")
.data(d => d.values);

var cellExit = td.exit().remove();

var cellEnter = td.enter().append("td").append("span");

td = cellEnter.merge(td)
.text(d => d);

这是带有 ref 函数的演示:

var data = [{
key: 1,
values: [1, 2, 3]
},
{
key: 2,
values: [3, 4, 5]
},
]

function update(data) {
var table = d3.select('#gogo');

var tr = table.selectAll('tr')
.data(data);

var rowExit = tr.exit().remove();

var rowEnter = tr.enter().append('tr');

tr = rowEnter.merge(tr);

var td = tr.selectAll("td")
.data(d => d.values);

var cellExit = td.exit().remove();

var cellEnter = td.enter().append("td").append("span");

td = cellEnter.merge(td)
.text(d => d)
}

update(data)
ref()

function ref() {
setInterval(() => {
data.map(item => {
for (var i = 0; i < 3; i++) {
item.values[i] = Math.floor(Math.random() * 100) + 1
}
})
update(data)
}, 1000)
}
table, tr, td {
border: 1px solid gray;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<table id="gogo"></table>

最后,为了向您展示现在更新函数确实会为任意数量的元素更新表格,我重构了您的 ref 函数以创建具有随机行数的数据,从 1 到 5 , 以及随机数的单元格,也是从 1 到 5:

var data = [{
key: 1,
values: [1, 2, 3]
},
{
key: 2,
values: [3, 4, 5]
},
]

function update(data) {
var table = d3.select('#gogo');

var tr = table.selectAll('tr')
.data(data);

var rowExit = tr.exit().remove();

var rowEnter = tr.enter().append('tr');

tr = rowEnter.merge(tr);

var td = tr.selectAll("td")
.data(d => d.values);

var cellExit = td.exit().remove();

var cellEnter = td.enter().append("td").append("span");

td = cellEnter.merge(td)
.text(d => d)
}

update(data)
ref()

function ref() {
setInterval(() => {
data = d3.range(~~(Math.random() * 5) + 1).map(function(d) {
return {
key: d,
values: d3.range(~~(Math.random() * 5) + 1).map(function(d) {
return ~~(Math.random() * 20)
})
}
})
update(data)
}, 1000)
}
table,
td,
tr {
border: 1px solid gray;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<table id="gogo"></table>

关于javascript - 嵌套数据中的 D3 v4 更新,最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com