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

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

当前回答

我遇到过这样的情况,我想把对象属性的“地址”作为数据传递给另一个函数,并填充对象(使用AJAX),从地址数组进行查找,并在另一个函数中显示。我不能使用点表示法而不做字符串杂技,所以我认为一个数组可能是很好的传递代替。我最终做了一些不同的事情,但似乎与这篇文章有关。

这是一个类似于我想要数据的语言文件对象的示例:

const locs = {
  "audioPlayer": {
    "controls": {
      "start": "start",
      "stop": "stop"
    },
    "heading": "Use controls to start and stop audio."
  }
}

我希望能够传递一个数组,如:["audioPlayer", "controls", "stop"]来访问语言文本,在这种情况下是"stop"。

我创建了这个小函数,它查找“最不特定的”(第一个)地址参数,并将返回的对象重新分配给自己。然后它准备查找下一个最特定的地址参数(如果存在的话)。

function getText(selectionArray, obj) {
  selectionArray.forEach(key => {
    obj = obj[key];
  });
  return obj;
}

用法:

/* returns 'stop' */
console.log(getText(["audioPlayer", "controls", "stop"], locs)); 

/* returns 'use controls to start and stop audio.' */
console.log(getText(["audioPlayer", "heading"], locs)); 

其他回答

你可以在Javascript中使用getter

getter文档

检查对象内部是否存在有问题的属性, 如果它不存在,就从窗口拿走

const something = {
    get: (n) => this.n || something.n || window[n]
};

你可以通过几种不同的方式来实现这一点。

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

foo.bar;
foo['bar'];

括号符号特别强大,因为它可以让你基于变量访问属性:

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

let prop = 'bar';

foo[prop];

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

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'

更新

使用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

我遇到过这样的情况,我想把对象属性的“地址”作为数据传递给另一个函数,并填充对象(使用AJAX),从地址数组进行查找,并在另一个函数中显示。我不能使用点表示法而不做字符串杂技,所以我认为一个数组可能是很好的传递代替。我最终做了一些不同的事情,但似乎与这篇文章有关。

这是一个类似于我想要数据的语言文件对象的示例:

const locs = {
  "audioPlayer": {
    "controls": {
      "start": "start",
      "stop": "stop"
    },
    "heading": "Use controls to start and stop audio."
  }
}

我希望能够传递一个数组,如:["audioPlayer", "controls", "stop"]来访问语言文本,在这种情况下是"stop"。

我创建了这个小函数,它查找“最不特定的”(第一个)地址参数,并将返回的对象重新分配给自己。然后它准备查找下一个最特定的地址参数(如果存在的话)。

function getText(selectionArray, obj) {
  selectionArray.forEach(key => {
    obj = obj[key];
  });
  return obj;
}

用法:

/* returns 'stop' */
console.log(getText(["audioPlayer", "controls", "stop"], locs)); 

/* returns 'use controls to start and stop audio.' */
console.log(getText(["audioPlayer", "heading"], locs)); 

其他人已经提到了“点”和“方”语法,所以我想以类似的方式介绍访问函数和发送参数。

Code 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