我已经阅读了此[SO post] [1],它有所帮助,但看起来好像在处理数据...
我已读入两个如下所示的CSV文件:
word, frequency
random, 462546
stupid, 34652
dumb, 4346
我将它们合并了,可以正常工作。我已经对它们进行了排序,但是,它成功了一半。排序功能对两个对象数组进行排序,就好像它们是分开的一样。我的意思是,我的两个对象阵列合并在一起,但是又将它们一个接一个地合并了。然后对一个对象数组进行排序,然后对另一个对象进行排序,而不是将它们作为一个整体数组进行排序,而是将它们作为两个数组进行排序。
我的CSV文件的链接位于enter link description here
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);
});
});
答案 0 :(得分:1)
您的数组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
出现在两个文件中。)