【问题标题】:Change object data更改对象数据
【发布时间】:2019-05-15 04:11:03
【问题描述】:

我有这个文本文件 (800kb url),其中存储了一些 JSON 数据。从文本文件中加载数据后,我想更改内容并对其进行循环。

我是使用这个简单的示例函数完成的;

var convertPriceFormat = function(content){
  var obj = {};

  for(var appid in content){

    var gameEntry = content[appid];

    for(var hashName in gameEntry){
      var entry = gameEntry[hashName];
      obj[hashName] = entry.price;
    };

    console.log(Object.keys(gameEntry).length);
  };

  return obj;
}

返回的对象中有四个子对象,它们都有大约3000个条目,数量并不多。

每个条目的所有数据都是这样结构化的;

'Pinstripe Suit Jacket': { 
                           average_price: 0.02,
                           listings: 11,
                           volume: 1185.03,
                           price: 0.03 
}

问题是;由于某些奇怪的原因,当我记录 gameEntry 的长度(即每个子对象的条目总数)时,第一个日志和第二个日志之间大约有 12 秒。

这是为什么?

加载时间(相对自开始以来,数字是它必须​​循环的条目数量):

2373 '3.48s'
5769 '24.422s'
1405 '25.326s'
641 '25.436s'

【问题讨论】:

  • 第一个日志显示是否也需要 12 秒?
  • @ack_inc 自服务器启动以来大约 5 秒,最后 2 秒几乎是即时的,它们都有
  • 我想说content[appid] 在这种情况下成本很高,因为对象中有 3000 个条目,但 12 秒太多了。
  • 您可以尝试使用var appid of Object.keys(content) 并与gameEntry 相同吗?我唯一的猜测是 in 也会循环其他属性。
  • @jhp 刚刚尝试过,还记录了在显示最后一行之前需要多少秒。它给了我同样的结果。从每个条目开始查看价格。

标签: javascript node.js object


【解决方案1】:

很可能该条目看起来并不像您认为的那样。试试这个代码或它的变体来追踪发生了什么。

var convertPriceFormat = function(content) {
  var obj = {};

  for (var appid in content) {
    console.log(`appid: ${appid}`)

    var gameEntry = content[appid];

    for (var hashName in gameEntry) {
        console.log(`hashName: ${hashName}`)

      var entry = gameEntry[hashName];
      obj[hashName] = entry.price;
    };

    console.log(Object.keys(gameEntry).length);
  };

  return obj;
}

const entry1 = {
  'Pinstripe Suit Jacket': {
    average_price: 0.02,
    listings: 11,
    volume: 1185.03,
    price: 0.03
  }
}

const entries = []

for (let i = 0; i < 3000; i++) {
  entries.push(entry1)
}

console.log(`Number of entries: ${entries.length}`)

convertPriceFormat(entries.slice(0,3))

【讨论】:

  • 我复制了这个函数(你有没有改变任何东西)并得到一个新的结果,每个 appid 大约 0.002s - 0.016s。如果我可以问,你有什么改变?
  • 在这个例子中,它只处理几个条目,参见“entries.slice(0,3)”。重要的是我们现在正在记录您的循环,此外,我们可以使用“运行代码 sn-p”共享相同的代码,以更好地了解正在发生的事情。
  • @Borda,你是从哪里了解到这个的。
【解决方案2】:

使用 hasOwnProperty 过滤 for in 循环。

var convertPriceFormat = function (content) {
    var obj = {};
    for (var appid in content) {
        var gameEntry = content[appid];
        for (var hashName in gameEntry) {
            var entry = gameEntry[hashName];
            obj[hashName] = entry.price;
        };
    };
    return obj;
}

var convertPriceFormat2 = function (content) {
    var obj = {};
    for (var appid in content) {
        if (content.hasOwnProperty(appid)) {
            var gameEntry = content[appid];
            for (var hashName in gameEntry) {
                if (gameEntry.hasOwnProperty(hashName)) {
                    var entry = gameEntry[hashName];
                    obj[hashName] = entry.price;
                }
            }
        }
    }
    return obj;
}

const entry1 = {
    'Pinstripe Suit Jacket': {
        average_price: 0.02,
        listings: 11,
        volume: 1185.03,
        price: 0.03
    }
}

const entries = []

for (let i = 0; i < 3000; i++) {
    entries.push(entry1)
}

console.log(`Number of entries: ${entries.length}`)

console.time("time")
convertPriceFormat(entries)
console.timeEnd("time")

console.time("time2")
convertPriceFormat2(entries)
console.timeEnd("time2")

平均结果更好

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2014-03-11
    相关资源
    最近更新 更多