我正在尝试使用动态名称访问对象的属性。 这是可能的吗?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
我正在尝试使用动态名称访问对象的属性。 这是可能的吗?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
其他人已经提到了“点”和“方括号”语法,所以我想用类似的方式来介绍访问函数和发送参数。
代码 jsfiddle
var obj = {method:function(p1,p2,p3){console.log("method:",arguments)}}
var str = "method('p1', 'p2', 'p3');"
var match = str.match(/^\s*(\S+)\((.*)\);\s*$/);
var func = match[1]
var parameters = match[2].split(',');
for(var i = 0; i < parameters.length; ++i) {
// clean up param begninning
parameters[i] = parameters[i].replace(/^\s*['"]?/,'');
// clean up param end
parameters[i] = parameters[i].replace(/['"]?\s*$/,'');
}
obj[func](parameters); // sends parameters as array
obj[func].apply(this, parameters); // sends parameters as individual values
演示对象示例
let obj = {
name: {
first_name: "Bugs",
last_name: "Founder",
role: "Programmer"
}
}
用于获取值的点分字符串键
let key = "name.first_name"
功能
const getValueByDottedKeys = (obj, strKey)=>{
let keys = strKey.split(".")
let value = obj[keys[0]];
for(let i=1;i<keys.length;i++){
value = value[keys[i]]
}
return value
}
调用 getValueByDottedKeys 函数
value = getValueByDottedKeys(obj, key)
console.log(value)
输出
Bugs
const getValueByDottedKeys = (obj, strKey)=>{
let keys = strKey.split(".")
let value = obj[keys[0]];
for(let i=1;i<keys.length;i++){
value = value[keys[i]]
}
return value
}
let obj = {
name: {
first_name: "Bugs",
last_name: "Founder",
role: "Programmer"
}
}
let key = "name.first_name"
value = getValueByDottedKeys(obj, key)
console.log(value)
您可以使用方括号表示法动态访问对象的属性。这将类似于obj[yourKey]
,但是JavaScript对象实际上并不是为动态更新或读取而设计的。
它们旨在在初始化时定义。如果您想动态分配和访问键值对,应改用映射。
const yourKey = 'yourKey';
// initialise it with the value
const map1 = new Map([
['yourKey', 'yourValue']
]);
// initialise empty then dynamically assign
const map2 = new Map();
map2.set(yourKey, 'yourValue');
console.log(map1.get(yourKey));
console.log(map2.get(yourKey));
我遇到了同样的问题,但是当处理嵌套属性时,lodash模块存在一定的限制。我按照递归下降解析器的思路编写了一个更通用的解决方案。该解决方案可以在以下Gist中找到:
对于任何想要设置嵌套变量值的人,以下是如何操作:
const _ = require('lodash'); //import lodash module
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.set(object, 'a[0].b.c', 4);
console.log(object.a[0].b.c);
// => 4
文档:https://lodash.com/docs/4.17.15#set
此外,如果您想获取一个值的文档:https://lodash.com/docs/4.17.15#get
我之前在这个话题上问了一个有点重复的问题,经过大量的研究,并且看到很多应该在这里的信息缺失,我感觉我有一些有价值的东西可以添加到这篇旧帖子中。
let properyValue = element.style['enter-a-property'];
然而,我很少选择这种方法,因为它不能处理通过样式表分配的属性值。为了给你举个例子,我将用一些伪代码进行演示。
let elem = document.getElementById('someDiv');
let cssProp = elem.style['width'];
function getCssProp(){
let ele = document.getElementById("test");
let cssProp = window.getComputedStyle(ele,null).getPropertyValue("width");
}
W3Schools getComputedValue Doc 这个链接提供了一个很好的例子,让你可以尝试一下。然而,这个链接 Mozilla CSS getComputedValue doc 更详细地介绍了getComputedValue函数,任何有志于开发的开发者如果对这个主题不是完全清楚的话,都应该阅读一下。
$(selector).css(property,value)
...获取和设置。这是我使用的方法,唯一的缺点是你必须要了解 JQuery,但这实际上是每个 JavaScript 开发者应该学习 JQuery 的众多好理由之一,它使生活变得轻松,并提供了像这样的方法,这在标准 JavaScript 中是不可用的。 希望这能帮助到某些人!!!
let storageData = this.data; // JSON Response
let preferredData = localStorage.getItem('preferredIndustry'); //foodItemsFeatured
/* Dynamically access Object's property */
this.preferredFeaturedItems = this.data[preferredData as keyof typeof storageData];
在Javascript中,您可以使用getter
检查对象内部是否存在所需属性, 如果不存在,则从窗口中获取
const something = {
get: (n) => this.n || something.n || window[n]
};
通过引用查找对象,无需使用字符串。请注意,您传递的对象是克隆的,我使用lodash中的cloneDeep进行克隆。
如果对象看起来像
const obj = {data: ['an Object',{person: {name: {first:'nick', last:'gray'} }]
路径看起来像这样
const objectPath = ['data',1,'person',name','last']
然后调用下面的方法,它将返回给定路径的子对象
const child = findObjectByPath(obj, objectPath)
alert( child) // alerts "last"
const findObjectByPath = (objectIn: any, path: any[]) => {
let obj = objectIn
for (let i = 0; i <= path.length - 1; i++) {
const item = path[i]
// keep going up to the next parent
obj = obj[item] // this is by reference
}
return obj
}
你应该使用JSON.parse
,可以参考https://www.w3schools.com/js/js_json_parse.asp
const obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}')
console.log(obj.name)
console.log(obj.age)