javascript - 在 Node.js 中修改大量 json 文件/数组时的奇怪之处

标签 javascript arrays json node.js

我正在处理一个巨大的 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/

相关文章:

php - 复选框更新页面(如果选中则显示更多信息)

javascript - Pin It 按钮出现在错误的位置

C : Input file does not sort in array

c++ - 确定数组是否可以排序旋转 3 个连续的数组元素?

ruby-on-rails - 如何将 Ruby on Rails 模型转换为 .json 文件?

javascript - 使用 UIAutomation javascript 进行 map View 测试

javascript - Firefox 扩展中的 Html 弹出 iframe

c++ - 将数组从 C++ 构造函数传递给函数

PHP:从mysql数据库中获取json中的多个对象

java - Spring 3.0.2 中如何设置请求内容类型?