使用字符串访问嵌套属性[重复]
Posted
技术标签:
【中文标题】使用字符串访问嵌套属性[重复]【英文标题】:Access a nested property with a string [duplicate] 【发布时间】:2016-01-09 02:03:42 【问题描述】:var person =
name: 'Joe',
contact:
phone: '555'
var nameOfPerson = person['name']; //Joe
var str = 'contact.phone';
var phoneToPerson = person[str]; //undefined
这有可能以某种方式做到吗?我得到了一些逻辑,我最终得到一个字符串,我需要用它访问一个嵌套属性。
https://jsbin.com/xehokozaco/edit?js,console
【问题讨论】:
而nameOfPerson = person.name
,你可以:phoneToPerson = person.contact.phone
【参考方案1】:
本机,没有。但是有办法做到这一点,比如用.
分割字符串并从person
对象递归下降。也可以通过评估 eval
或 new Function
中的完整字符串来实现,但出于安全原因,我强烈反对。
【讨论】:
【参考方案2】:您必须按句点拆分字符串,然后迭代地访问每个节点。这可以通过简单的reduce
来完成:
var value = str.split('.').reduce(function(p,prop) return p[prop] , person);
无论str
是否包含句点,上述方法都有效,即name
和contact.phone
。
【讨论】:
【参考方案3】:您可以通过拆分字符串。 [..]
运算符允许您按名称(和数组项索引)访问对象属性。在嵌套对象的情况下,您只需一个接一个地访问它们。
试试这样:
var person =
name: 'Joe',
contact:
phone: '555'
var nameOfPerson = person['name']; //Joe
var str = 'contact.phone';
var phoneToPerson = str.split('.').reduce(function(o, key)
return o[key];
, person);
alert(phoneToPerson);
【讨论】:
【参考方案4】:试试
var select = "contact.phone";
var value = person;
select.split(".").forEach(function(val)
value = value[val];
);
console.log(value);
【讨论】:
【参考方案5】:我知道这篇文章已经很老了,但很奇怪我在这里看不到非常流行的“Lodash”解决方案,它允许安全地获取对象嵌套属性。
例子:
var object =
a: [
b:
c: 3
]
;
_.get(object, 'a[0].b.c'); // → 3
你的例子:
var person =
name: 'Joe',
contact:
phone: '555'
var personPhoneProp = 'contact.phone';
_.get(person, personPhoneProp); // -> '555'
文档:https://lodash.com/docs#get
【讨论】:
以上是关于使用字符串访问嵌套属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章
将具有无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]