You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D3.js加载CSV后仅打印排序数据,原始数据未显示问题求助

问题场景

我有一个名为text.csv的CSV文件,内容如下:

shape,color,distance
circle,blue,4
square,red,2
circle,blue,7
circle,green,9
triangle,blue,1
square,green,3
octagon,blue,4

希望完成以下操作:

  • 加载该数据
  • 在控制台打印加载的原始数据
  • 按distance字段对加载的数据进行排序
  • 在控制台打印排序后的数据

编写的D3.js v7代码如下:

<script src="https://d3js.org/d3.v7.min.js"></script>

d3.csv('test.csv', d3.autoType).then(function(data) {
    // INSPECTS THE RAW DATA
    console.log(data);

    // SORTS BY DISTANCE
    let sortedData = data.sort(function (a, b) {
        return d3.descending(a.distance, b.distance);
    })
    // LOGS SORTED DATA
    console.log(sortedData);
})

但控制台中只看到sortedData被打印两次,原始数据data并未打印,请问原因是什么?

问题原因与解决方法

核心原因

JavaScript的数组sort()方法是原地修改的——它会直接改变原数组的顺序,而不是返回一个新数组。你这里的sortedData只是原数组data的引用,二者指向同一个内存地址的数组。

另外,浏览器控制台打印数组/对象时,默认显示的是该对象的当前状态,而非调用console.log()时的快照。当你先打印data,随后排序修改了原数组,等你在控制台展开这个data的打印结果时,它已经是排序后的状态了,看起来就像原始数据没打印,反而打印了两次排序后的数组。

解决方法

要保留原始数据,需要先创建原数组的副本,再对副本进行排序。可以用扩展运算符[...data]或slice()方法创建浅拷贝(对于这种简单数据结构足够用):

修正后的代码:

<script src="https://d3js.org/d3.v7.min.js"></script>

d3.csv('test.csv', d3.autoType).then(function(data) {
    // 打印原始数据
    console.log('原始数据:', data);

    // 创建数组副本后再排序,不修改原数组
    let sortedData = [...data].sort(function (a, b) {
        return d3.descending(a.distance, b.distance);
    })
    // 打印排序后的数据
    console.log('排序后数据:', sortedData);
})

这样原数组data不会被修改,控制台打印的原始数据就是加载时的状态,排序后的数组是独立的副本,二者区分明显。

内容的提问来源于stack exchange,提问作者equanimity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:10:24