两个对象数组正在合并,但没有排序-D3

时间:2018-09-04 18:28:17

标签: javascript d3.js

我已经阅读了此[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);

    });
});

1 个答案:

答案 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出现在两个文件中。)