问题:使用变量动态访问对象属性

我正在尝试使用动态名称访问对象的属性。这可能吗?

const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
标签:javascript,object,properties

回答1:

两种访问属性的方式对象:

  • 点表示法:something.bar
  • 括号符号:something['bar']

括号之间的值可以是任何表达式。因此,如果属性名称存储在变量中,则必须使用方括号表示法:

var foo = 'bar';
something[foo];
// both x = something[foo] and something[foo] = x work as expected

回答2:

这是我的解决方案:

function resolve(path, obj) {
    return path.split('.').reduce(function(prev, curr) {
        return prev ? prev[curr] : null
    }, obj || self)
}

用法示例:

resolve("document.body.style.width")
// or
resolve("style.width", document.body)
// or even use array indexes
// (someObject has been defined in the question)
resolve("part.0.size", someObject) 
// returns null when intermediate properties are not defined:
resolve('properties.that.do.not.exist', {hello:'world'})

回答3:

在javascript中,我们可以使用:

  • 点符号-foo.bar
  • 方括号-foo[someVar]foo["string"]

但是只有第二种情况允许动态访问属性:

var foo = { pName1 : 1, pName2 : [1, {foo : bar }, 3] , ...}

var name = "pName"
var num  = 1;

foo[name + num]; // 1

// -- 

var a = 2;
var b = 1;
var c = "foo";

foo[name + a][b][c]; // bar

回答4:

下面是一个ES6示例,说明如何使用通过连接两个字符串动态生成的属性名称来访问对象的属性。

var suffix = " name";

var person = {
    ["first" + suffix]: "Nicholas",
    ["last" + suffix]: "Zakas"
};

console.log(person["first name"]);      // "Nicholas"
console.log(person["last name"]);       // "Zakas"

这称为计算出的属性名称

回答5:

您可以通过很多不同的方式来实现这一目标。

let foo = {
    bar: 'Hello World'
};

foo.bar;
foo['bar'];

括号表示法特别强大,因为它使您可以基于变量访问属性:

let foo = {
    bar: 'Hello World'
};

let prop = 'bar';

foo[prop];

这可以扩展为遍历对象的每个属性。由于更新的JavaScript结构(例如for ... of),这似乎是多余的,但有助于说明一个用例:

let foo = {
    bar: 'Hello World',
    baz: 'How are you doing?',
    last: 'Quite alright'
};

for (let prop in foo.getOwnPropertyNames()) {
    console.log(foo[prop]);
}

点号和方括号符号也可按预期对嵌套对象起作用:

let foo = {
    bar: {
        baz: 'Hello World'
    }
};

foo.bar.baz;
foo['bar']['baz'];
foo.bar['baz'];
foo['bar'].baz;

对象分解

我们也可以将对象分解视为一种访问对象中属性的方法,但如下:

let foo = {
    bar: 'Hello World',
    baz: 'How are you doing?',
    last: 'Quite alright'
};

let prop = 'last';
let { bar, baz, [prop]: customName } = foo;

// bar = 'Hello World'
// baz = 'How are you doing?'
// customName = 'Quite alright'

回答6:

已更新

我考虑了以下意见并表示同意。避免评估。

使用obj[variable]可以轻松实现访问对象的根属性,但是嵌套会使事情复杂化。不写已经写好的代码,我建议使用lodash.get

示例

// Accessing root property
var rootProp = 'rootPropert';
_.get(object, rootProp, defaultValue);

// Accessing nested property
var listOfNestedProperties = [var1, var2];
_.get(object, listOfNestedProperties);

Lodash get可以以多种方式使用,这是文档链接 lodash.get

回答7:

您可以使用Lodash get

这样操作
_.get(object, 'a[0].b.c');

回答8:

每当需要动态访问属性时,都必须使用方括号来访问属性而不是""。运算符
语法:object [propery}

const something = { bar: "Foobar!" };
const foo = 'bar';
// something.foo; -- not correct way at it is expecting foo as proprty in  something={ foo: "value"};
// correct way is  something[foo]
alert( something[foo])

回答9:

当您还必须将参数传递给此函数时,它会变得很有趣。

代码 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

回答10:

ES5 //检查深度嵌套的变量

这段简单的代码可以检查深度嵌套的变量/值的存在,而不必一路检查每个变量...

var getValue = function( s, context ){
    return Function.call( context || null, 'return ' + s )();
}

例如-深度嵌套的对象数组:

a = [ 
    {
      b : [
          {
             a : 1,
             b : [
                 {
                    c : 1,
                    d : 2   // we want to check for this
                 }
             ]
           }
      ]
    } 
]

代替:

if(a && a[0] && a[0].b && a[0].b[0] && a[0].b[0].b && a[0].b[0].b[0] && a[0].b[0].b[0].d && a[0].b[0].b[0].d == 2 )  // true

我们现在可以:

if( getValue('a[0].b[0].b[0].d') == 2 ) // true

干杯!

回答11:

我问了一个问题,该问题在不久前经过反复研究后又在这个主题上重复出现,并且发现这里应该缺少很多信息,我觉得我可以在此较旧的帖子中添加一些有价值的东西。

  • 首先,我想解决的是,有几种方法可以获取属性的值并将其存储在动态变量中。恕我直言,最流行,最简单的方法是:
let properyValue = element.style['enter-a-property'];

但是我很少走这条路,因为它不适用于通过样式表分配的属性值。举个例子,我将用一些伪代码进行演示。

 let elem = document.getElementById('someDiv');
 let cssProp = elem.style['width'];

使用上面的代码示例;如果存储在'elem'变量中的div元素的width属性是在CSS样式表中设置样式的,而不是在其HTML标签的内部设置的样式,那么毫无疑问,您将获得内部存储的undefined的返回值cssProp变量的值。出现未定义的值是因为为了获得正确的值,因此需要按顺序计算在CSS样式表中编写的代码以获取值。您必须使用一种可以计算属性值的方法,该属性的值位于样式表之内。

  • 因此,现在有了getComputedStyle()方法!
function getCssProp(){
  let ele = document.getElementById("test");
  let cssProp = window.getComputedStyle(ele,null).getPropertyValue("width");
}

W3Schools getComputedValue文档这给出了一个很好的例子,让您可以玩它,但是,此链接 Mozilla CSS getComputedValue文档讨论了详细介绍了getComputedValue函数,任何对此主题不太清楚的有抱负的开发人员都应该阅读它。

  • 请注意,getComputedValue方法只能获取,而不会设置。这显然是一个主要的缺点,但是,尽管它不是标准的Javascript,但是有一种方法可以从CSS样式表中获取并设置值。 jQuery方法...
$(selector).css(property,value)

...得到并完成设置。这就是我所使用的,唯一的缺点是您必须了解JQuery,但是老实说,这是每个Javascript开发人员都应该学习JQuery的很多很好的原因之一,它使生活变得轻松,并提供了像这样的方法,不适用于标准Javascript。希望这对某人有帮助!

回答12:

有几种可能性:

const test = {
    prop1: {
      prop2: {
        prop3: "I'm very nested"
      }
    }

const test1 = test.prop1.prop2.prop3
const test2 = test['prop1']['prop2']['prop3']
const test3 = test['prop1.prop2.prop3'] //will return undefined
const test4 = _.get(test, 'prop1.prop2.prop3') //use lodash

如果您想动态获取嵌套值(例如按变量),则最好的选择是使用lodash

回答13:

您应该使用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)

回答14:

const something = { bar: "Foobar!" };
const foo = 'bar';

something[\`${foo}\`];
回到顶部