【问题标题】:Trouble Accessing Data from object within object (javascript) [duplicate]无法从对象内的对象访问数据(javascript)[重复]
【发布时间】:2015-02-26 01:16:45
【问题描述】:

我一直在使用 html、css 和 javascript 创建一个口袋妖怪统计计算器供我个人使用。该代码大部分都有效,我的问题是基于它的特定部分。

var Natures = { 'Adamant':{'pos':'Atk', 'neg':'SpA'} }

上图是一个存储自然数据的对象示例(每种自然将一个属性提高 10%,并将另一个属性降低相同的数量)。自然值是具有属性的对象,这些属性表示它们正在提升和减少的统计数据。我的问题在于以下代码:

if(Natures.hasOwnProperty(nature)) {
    var plus = eval(Natures.nature['pos']);
    var minus = eval(Natures.nature['neg']);
    base.plus = Math.floor(base.plus*1.1);
    base.minus = Math.floor(base.minus*0.9);
}

if 语句位于修改对象 (base) 并输出其值(6 个统计数据各一个)的函数内部。 if 语句检查 Natures 对象中的特定 nature (作为函数参数给出的字符串)。

经过一些测试,我确信 if 语句可以正常工作。问题在于接下来的两行。它们旨在访问自然的 posneg 值并将它们存储为 plusminus。 eval() 在那里,所以我可以使用 plusminus 来访问和修改 base 的适当值,它们不是字符串。

我检查了一下,没有发现我的语法有任何问题。我也确定我已经在上面发布的代码中隔离了问题。 nature 不在 Natures 中,该函数运行良好。另外,我只在 Chrome(版本 40.0.2214.115)中对此进行了测试,所以它可能是浏览器。

【问题讨论】:

  • 不,你不想使用eval。当然不是。

标签: javascript object syntax nested


【解决方案1】:

几个问题:

首先,更改这些行

var plus = eval(Natures.nature['pos']);
var minus = eval(Natures.nature['neg']);
base.plus = Math.floor(base.plus*1.1);
base.minus = Math.floor(base.minus*0.9);

var plus = eval(Natures[nature]['pos']);
var minus = eval(Natures[nature]['neg']);
base[plus] = Math.floor(base[plus]*1.1);
base[minus] = Math.floor(base[minus]*0.9);

其次,eval('Atk')eval('SpA') 将不起作用,除非它们在其他地方定义。

【讨论】:

  • 您已经有效地回答了我的问题。作为后续,这是否意味着 eval() 不能用于代表特定类型的属性? eval('Atk') 应该等于一个非字符串对象键(用于多个对象)。我一直在使用对象文字表示法。如果我使用对象构造方法,该方法会起作用吗?
  • eval 是邪恶的。使用它不是一个好习惯。从你的例子中我看不出你为什么要使用它,为什么不简单地将你需要的值放在对象本身中(也许我错过了一些东西,因为我从来没有对口袋妖怪感兴趣)。
  • 我不再将 eval 用于我向您展示的部分,但我需要在程序的另一部分使用它。该程序根据用户输入的几个因素计算口袋妖怪的统计数据。一个因素是口袋妖怪的基本统计数据,我已将其存储为一个对象。用户选择宠物小精灵,程序获取选择选项的值并使用它来调用适当的对象并获取基本统计信息。该值是一个字符串,因此我必须使用 eval 将其转换为可以使用它来调用对象的东西。在这里,我想我也可以使用 eval 来调用对象键。
猜你喜欢
  • 2019-10-06
  • 2013-07-17
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多