尝试使用 then() 方法之外的函数对 d3.csv().then() Promise 对象中的数据进行排序时出现 TypeError
Getting TypeError when trying to sort data within a d3.csv().then() Promise object using a function outside of the then() method
我试图让用户在我正在处理的 D3 可视化中对一些运动统计数据进行排序。我正在使用 D3v6。
我很困惑为什么我可以使用 then() 方法之外的函数对数据进行排序,但是当我尝试使用排序后的数据时它会中断。
我已尝试创建以下问题的最小实现。
https://codepen.io/sspboyd/pen/rNWgOVr
sort_by(val)
函数工作并将 return 排序数组,但如果我尝试在 then() 函数中使用新排序的数据,我会收到错误消息。我得到的错误是:Uncaught (in promise) TypeError: items is undefined.
令人困惑的是,如果我在 then() 方法中执行完全相同的排序操作,它会起作用!?!
代码如下:
let svg = d3.select("body")
.append("svg")
.attr("width", 600)
.attr("height", 800);
let player_data = d3.csv('./player_data.csv');
let sort_by = function(val){
console.log(`Passed in value is: ${val}`);
player_data.then(function(data){
let new_data = data.slice().sort((a,b) => d3.descending(+a[val], +b[val]));
console.log(new_data);
return new_data;
});
};
player_data.then(function(data){
// let sorted_by_Assists = data.slice().sort((a,b) => d3.descending(+a.A, +b.A));
// data = sorted_by_Assists; // <---- This works.
data = sort_by("A"); // <---- This does not work?!?!? Throws error:
// "Uncaught (in promise) TypeError: items is undefined"
let player_nodes = d3.select("svg")
.selectAll("g")
.data(data, d=>d.Player)
.enter()
.append("g")
.attr("transform", function(d,i){return `translate(10,${i*30})`})
.attr("class","player_node");
let player_info = player_nodes
.append("text")
.attr("x",0)
.attr("y",0)
.attr("dy", "1em")
.text(function(d){return `${d.Player} - Games Played: ${d.GP}, Points: ${d.P}, Goals: ${d.G}, Assists: ${d.A}`});
});
我很困惑,所以感谢您的帮助或建议!
在 codepen 中提到的第 23 行中,将已解析的 data
传递给 sort_by
函数
data = sort_by("A", data);
现在 sort_by
功能将
let sort_by = function(val, playerData){
console.log(`Passed in value is: ${val}`);
if(playerData) {
return sortLogic(val, playerData)
} else {
player_data.then(function(data){
return sortLogic(val, data);
});
}
};
let sortLogic = function (val, data) {
let new_data = data.slice().sort((a,b) => d3.descending(+a[val], +b[val]));
console.log(new_data);
return new_data;
}
我试图让用户在我正在处理的 D3 可视化中对一些运动统计数据进行排序。我正在使用 D3v6。
我很困惑为什么我可以使用 then() 方法之外的函数对数据进行排序,但是当我尝试使用排序后的数据时它会中断。
我已尝试创建以下问题的最小实现。
https://codepen.io/sspboyd/pen/rNWgOVr
sort_by(val)
函数工作并将 return 排序数组,但如果我尝试在 then() 函数中使用新排序的数据,我会收到错误消息。我得到的错误是:Uncaught (in promise) TypeError: items is undefined.
令人困惑的是,如果我在 then() 方法中执行完全相同的排序操作,它会起作用!?!
代码如下:
let svg = d3.select("body")
.append("svg")
.attr("width", 600)
.attr("height", 800);
let player_data = d3.csv('./player_data.csv');
let sort_by = function(val){
console.log(`Passed in value is: ${val}`);
player_data.then(function(data){
let new_data = data.slice().sort((a,b) => d3.descending(+a[val], +b[val]));
console.log(new_data);
return new_data;
});
};
player_data.then(function(data){
// let sorted_by_Assists = data.slice().sort((a,b) => d3.descending(+a.A, +b.A));
// data = sorted_by_Assists; // <---- This works.
data = sort_by("A"); // <---- This does not work?!?!? Throws error:
// "Uncaught (in promise) TypeError: items is undefined"
let player_nodes = d3.select("svg")
.selectAll("g")
.data(data, d=>d.Player)
.enter()
.append("g")
.attr("transform", function(d,i){return `translate(10,${i*30})`})
.attr("class","player_node");
let player_info = player_nodes
.append("text")
.attr("x",0)
.attr("y",0)
.attr("dy", "1em")
.text(function(d){return `${d.Player} - Games Played: ${d.GP}, Points: ${d.P}, Goals: ${d.G}, Assists: ${d.A}`});
});
我很困惑,所以感谢您的帮助或建议!
在 codepen 中提到的第 23 行中,将已解析的 data
传递给 sort_by
函数
data = sort_by("A", data);
现在 sort_by
功能将
let sort_by = function(val, playerData){
console.log(`Passed in value is: ${val}`);
if(playerData) {
return sortLogic(val, playerData)
} else {
player_data.then(function(data){
return sortLogic(val, data);
});
}
};
let sortLogic = function (val, data) {
let new_data = data.slice().sort((a,b) => d3.descending(+a[val], +b[val]));
console.log(new_data);
return new_data;
}