以下内容完美无缺,直到将密钥发送给它并带有小数。然后它会触发一个"意外的数字"。我可以想一些与修改从数据库发送的对象中的键有关的工作,但是想弄清楚为什么这会先触发错误。
以下内容发生了什么:
用户(例如,5日,15日,35日,62.5日等)从FE发送多个百分位数作为对象(例如incP1: 5th, incP2: 15th, etc.
),然后将其映射。 / p>
如果密钥以inc
开头,它会执行一定的逻辑。
它构造一个与fieldStr
对象中的键对应的字符串(cr
),该字符串基本上是用户请求的百分位数的实际值。
在这种情况下,它会构建类似cr.TestInc15
let fieldObj = eval(fieldStr)
然后返回构建的密钥的cr.
的值。
希望这是有道理的,但这就是我使用eval()
的原因,因为我无法从键中获取值作为字符串。它工作正常,直到它达到像第62.5百分位那样的键,其中键将被构造为cr.TestInc62.5
,它在cr.
中肯定具有值,因为我可以console.log
它。
renderData(percentiles, cr, varName) {
return (
_.map(
_.pickBy(percentiles, function (value, key) {
return _.startsWith(key, 'inc')
}), p => {
let fieldStr = 'cr.' + varName + 'Inc' +
(p == 'n' ? 'N' :
(p == 50 ? 'Median' : p
));
// a bunch of junk after this, but error stops it here
let fieldObj = eval(
fieldStr
);
}
)
)
}
答案 0 :(得分:1)
当然,您可以使用字符串获取值,即使在将点作为属性名称的一部分的情况下,也可以在不使用eval的情况下访问对象属性。
它被称为括号表示法
请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors
var cr = { "TestInc62.5": "Val123" }
console.log(cr["TestInc62.5"]);