【问题标题】:Accessing sub-objects in a "for in" loop?在“for in”循环中访问子对象?
【发布时间】:2012-02-29 03:04:22
【问题描述】:

这是我想要实现的一些示例代码:

pingpong = {
    paddleA: {
        speed: 5,
    },
    paddleB: {
        speed: 6,
    },
    paddleAI: {
        AI1: "paddleA",
        AI2: "paddleB"
    }
}

paddleAI = pingpong.paddleAI;
paddleA = pingpong.paddleA;
paddleB = pingpong.paddleB;

for (paddle in paddleAI) {
    document.write(paddleAI[paddle].speed);
}

当我运行这段代码时,它返回“未定义”

我正在尝试使用 paddleAI 中的文本值作为我想要访问的桨的速度。

如何让该代码返回 paddleApaddleB 的速度值?

注意: 这只是与我的实际代码相似的演示,因此我没有太多空间来大幅重组我存储和访问我的值的方式。

【问题讨论】:

  • 这会起作用,除非你引用 paddleAI 而不是 pingpong
  • 抱歉,我忘记在示例代码中解决这个问题。我知道这不是现在的问题。

标签: javascript html5-canvas


【解决方案1】:

这可能就是你所追求的......

使用pingpong.paddleAI的内容告诉你有哪些桨可用...

您的问题是您在循环中使用 paddle 期望桨名,而实际上您正在获取属性名称(例如...AI1

https://stackoverflow.com/a/5263872/555384

for (paddle in paddleAI) {
    document.write(pingpong[paddleAI[paddle]].speed);
}

虽然这似乎是非常糟糕的方式......

另外,你的尾随逗号会让 IE 不合适...删除对象/数组字面量声明中的最后一个逗号

【讨论】:

  • 我试过了,效果很好。我不知道为什么它会以这种方式工作,但我想并非所有事情都必须有意义。感谢您的回答!顺便说一句,我从示例中删除了尾随逗号。我的完整代码中没有它们,所以我不知道为什么我把它们放在那里 xD
  • 阅读for..in 以了解其工作原理...stackoverflow.com/a/5263872/555384
【解决方案2】:

想想你所追求的是这样的:

pingpong = {
    paddleA: {
        speed: 5,
    },
    paddleB: {
        speed: 6,
    },
    paddleAI: {
        AI1: "paddleA",
        AI2: "paddleB",
    },
}

for (paddle in pingpong.paddleAI) {
    document.write(pingpong[pingpong.paddleAI[paddle]].speed);
}

【讨论】:

    【解决方案3】:

    您的初始参考已关闭。此外,paddle 将引用该对象,但您需要该值(这实际上是一个键)。代码胜于雄辩:(jsFiddle demo)

    var pingpong = {
        paddleA: {
            speed: 5,
        },
        paddleB: {
            speed: 6,
        },
        paddleAI: {
            AI1: "paddleA",
            AI2: "paddleB",
        },
    }
    //reference paddleAI
    var pAI = pingpong.paddleAI;
    for (paddle in pAI) {
        //here paddle reference AI1 or AI2 but we want its value
        var key = pAI[paddle];
        //and on top of that its value is a reference to the key we really want
        var paddleRef = pingpong[key];
        document.write(paddleRef.speed);
    }
    

    【讨论】:

      【解决方案4】:

      DEMO

      您想循环遍历pingpong.paddleAI 的键,而不仅仅是paddleAI。此外,您想获取paddleAI 属性的,而不是键

      for (paddle in pingpong.paddleAI) {
          var keyVal = pingpong.paddleAI[paddle]; 
          if (pingpong[keyVal].speed)
              console.log(pingpong[keyVal].speed);
          else  //if you want
              console.log("no speed on " + keyVal);
      }
      

      【讨论】:

      • @ryansworld10 - 这段代码没有完成你想要的吗?不知道为什么这被否决了。
      • 我删除了反对票。它似乎与我最初寻找的有点不同。
      • @ryansworld10 - 谢谢 - 这与所有其他赞成的答案相同,只是更多了一些
      【解决方案5】:
      alert(pingpong.paddleA.speed)
      alert(pingpong.paddleb.speed)
      

      这是一个简单的层次结构,不需要循环。

      【讨论】:

      • 正如我所说,这是基于我的代码的演示。我知道我可以简单地显示这些值,但这不适用于我试图在我的应用程序中完成的任务。
      猜你喜欢
      • 1970-01-01
      • 2021-03-15
      • 2013-10-29
      • 2015-06-07
      • 2020-07-25
      • 2019-04-24
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多