javascript - 两个对象数组正在合并,但它们没有排序 - D3
问题描述
我已经阅读了这篇 [SO 帖子][1],它有所帮助,但看起来它已经在处理数据......
我读过两个看起来像这样的 CSV 文件:
word, frequency
random, 462546
stupid, 34652
dumb, 4346
我已经合并了它们,这很有效。我已经对它们进行了排序,但是,它成功了一半。排序函数对两个对象数组进行排序,就好像它们是分开的一样。我的意思是,我的两个对象数组合并在一起,但它一个接一个地合并了它们。然后对一个对象数组进行排序,然后对另一个对象进行排序,而不是将它们排序为一个完整的数组,而是将它们排序为两个数组。
指向我的 CSV 文件的链接在此处输入链接描述
d3.csv("data/ArsenalDictionary.csv", function(error1, Arsenal) {
d3.csv("data/ChelseaDictionary.csv", function(error2, Chelsea) {
var selected = d3.merge([Arsenal, Chelsea]);
selected.sort(function(a, b){ return d3.descending(a[2], b[2]); })
console.log(selected);
});
});
解决方案
您的数组selected
未排序,因为您试图通过不存在的属性对对象进行排序。
数组的元素是具有两个属性的对象,"words"
和" frequency"
(注意后者的前导空格)。您正在尝试按2
他们没有的名为 的属性对它们进行排序。
按频率属性对它们进行排序会更好:
selected.sort(function(a, b){ return d3.descending(a[" frequency"], b[" frequency"]); });
但是请注意,这并不完全符合您的预期:频率以 94、9、9、9、...、8、8、8、...等顺序结束。这是因为它们已经排序为字符串,而不是数字。
为了解决这个问题,要么在排序时将值转换为数字(注意额外的+
符号):
selected.sort(function(a, b){ return d3.descending(+a[" frequency"], +b[" frequency"]); });
或者,您可以将频率转换为数字作为读取文件的一部分:
function mapRow(row) {
return { "words": row["words"], " frequency": +row[" frequency"] };
}
d3.csv("ArsenalDictionary.csv", mapRow, function(error1, Arsenal) {
d3.csv("ChelseaDictionary.csv", mapRow, function(error2, Chelsea) {
// ...
前者更方便,但如果你想用数字做其他事情,后者可能会更有用,例如如果两个文件使用相同的单词,则将两个计数相加。(world
出现在两个文件中)。
推荐阅读
- django-rest-framework - 在视图中使用嵌套的可写序列化程序会产生 AttributeError:
- r - 如何根据特定值在df中插入空白行
- airflow - 通过字典动态循环创建气流 dag
- angular7 - 拖动 FabricJS 对象前需要选择
- javascript - 如何停止 blur() 事件函数触发两次?
- ionic-framework - 在 Ionic4 的主页内初始化组件
- vmware - 获取 VMWare 集群级别指标
- python - 卡在 GUI 中的 while 循环中
- python - 如何在 Django 中为客户用户模型创建注册表单?
- gallery - 画廊中的行高