我正在处理一个巨大的 json 文件(将近 60 MB),我试图删除其中 volume = 0 的所有条目。数组的格式是
{
"date": 1424373000,
"high": 0.33,
"low": 225,
"open": 0.33,
"close": 225,
"volume": 0.999999,
"quoteVolume": 0.00444444,
"weightedAverage": 225
}
为此,我使用了这段代码。
fs.readFile('JSONFiles/poloniexBTCDataFeb19|2015-July2|2018.json', function read(err, data) {
if (err) {
throw err;
}
rawdata = JSON.parse(data);
rawdata.forEach(function(val, index, array) {
if (rawdata[index].volume == 0) {
rawdata.splice(index, 1)
}
})
});
问题是它只删除了大约一半具有此特征的条目 (60k/108k)。我解决这个问题的方法是使用一个 for 循环,它运行代码 9 次,将它们全部删除,但这会导致代码花费更长的时间,因为整个 json 文件有大约 360k 个条目,它必须检查每个条目如果声明。我想知道是否有任何方法可以在不需要以这种方式使用 for 循环的情况下实际删除它们?
编辑:我意识到我一开始就不需要这段代码,所以没关系,但感谢所有答案。我希望这对遇到类似问题的其他人有所帮助。
最佳答案
问题是,您正在改变数组 rawdata
。让我们以数组 [e1, e2, e3, e4] 和代码为例,
var arr = ['e1', 'e2', 'e3', 'e4']
arr.forEach(function(elem, idx){
console.log('checking elem', elem);
if (elem === 'e2'){
arr.splice(idx, 1)
}
});
console.log('\nAfter iteration', arr);
如您所见,我在遇到 e2
时将其删除。这会影响实际的数组和被替换的元素,将不会被检查(因为每个迭代已经访问了该索引处的元素)。在上面的代码中,e3
没有被检查。因此,建议不要在 forEach 迭代中改变数组。
你可以这样做,
rawdata.slice().forEach(function (val, index, array) {
if (rawdata[index].volume == 0) {
rawdata.splice(index, 1)
}
});
此处 slice()
将创建一个新数组,并且改变您的原始 rawdata
不会影响迭代。
关于javascript - 在 Node.js 中修改大量 json 文件/数组时的奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51203249/