代码之家  ›  专栏  ›  技术社区  ›  TrampolineTales

有没有比在JSON上进行迭代更节省CPU的方法数组.map()鉴于我的具体情况?

  •  0
  • TrampolineTales  · 技术社区  · 6 年前

    mana_cost 在以下两种数据结构之一中始终可用:

    {
      "data": [
        {
          "mana_cost": "{2}"
        },
        {
          "mana_cost": "{G}"
        },
        //etc...
      ]
    }
    

    {
      "data": [
        {
          "card_faces": [
            {
              "mana_cost": "{U}"
            }
          ]
        }
      ]
    }
    

    我的程序创建一个名为 possibleManaCosts 它拥有 人力成本 在JSON中找到,如下所示:

    var obj = JSON.parse(body); //body is the JSON requested from the API
    var possibleManaCosts = [];
    
    obj.data.map(function(e) {    
        t = (e.card_faces == undefined) ? e.mana_cost : e.card_faces[0].mana_cost
    
        if (possibleManaCosts.indexOf(t) == -1) {
            possibleManaCosts.push(t);
        }
    });
    

    Array.map() 我失踪了?正在切割 数组.map() 支持另一个更好的功能?

    提前谢谢!

    2 回复  |  直到 6 年前
        1
  •  3
  •   p.s.w.g    6 年前

    这个 map forEach 真的帮不了你(你真的应该使用 forEach 如果您没有执行投影)。你可以用一个 for 非常轻微 速度提升:

    var possibleManaCosts = {};
    
    for (var i = 0; i < obj.data.length; i++) {
      t = (e.card_faces == undefined) ? e.mana_cost : e.card_faces[0].mana_cost
    
      if (possibleManaCosts.indexOf(t) == -1) {
        possibleManaCosts.push(t);
      }
    }
    

    更重要的是移除 indexOf(t) possibleManaCosts ,保留一个对象,每个键的值为 mana_cost

    var possibleManaCosts = {};
    
    for (var i = 0; i < obj.data.length; i++) {
      t = (e.card_faces == undefined) ? e.mana_cost : e.card_faces[0].mana_cost
    
      possibleManaCosts[t] = true;
    }
    
    possibleManaCosts = Object.keys(possibleManaCosts);
    

    非常 Premature optimization is the root of all evil .

        2
  •  1
  •   Koushik Chatterjee    6 年前

    不管怎么说,你不需要像解析一个字符串一样解析它(在case中,你不需要额外的工作)。但是,如果您将对象作为输入并创建一个json字符串来解析它,这样您就可以非常轻松地递归地进行迭代,那么这种想法就不好了。从性能来看,这很糟糕,但很简单。

    var inputStr = `{
          "data": [
            {
              "mana_cost": "{2}"
            },
            {
              "mana_cost": "{G}"
            },
            {
              "nested": { "mana_cost": "{Z}" }
            },
            {
              "mana_cost": "{G}"
            }
          ]
        }`,
        res = {},
        parsedData = JSON.parse(inputStr, (k, v) => {
                        k==="mana_cost" && (res[v] = true);
                        return v;
                      })
     console.log(Object.keys(res));
        3
  •  0
  •   Abion47    6 年前

    for 到目前为止,loop可能是性能最好的:

    var obj = JSON.parse(body);
    var costs = {};
    
    for (let i = 0; i < obj.data.length; i++) {
      costs[data.mana_cost] = true; // Or some other value
    }