首页 > 解决方案 > 两个对象数组正在合并,但它们没有排序 - 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);

    });
});

标签: javascriptd3.js

解决方案


您的数组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出现在两个文件中)。


推荐阅读