Использовать переменную Javascript в качестве имени объекта

Я хочу использовать значение переменной для доступа к объекту.

Скажем, у меня есть объект с именем myobject.

Я хочу заполнить переменную этим именем и использовать переменную для доступа к объекту.

Пример:

var objname = 'myobject';
{objname}.value = 'value';

Ответ 1

Global:

myObject = { value: 0 };
anObjectName = "myObject";
this[anObjectName].value++;

console.log(this[anObjectName]);

Глобальный: v2

var anObjectName = "myObject";
this[anObjectName] = "myvalue"

console.log(myObject)

Локальный: v1

(function() {
    var scope = this;

    if (scope != arguments.callee) {
        arguments.callee.call(arguments.callee);
        return false;
    }

    scope.myObject = { value: 0 };
    scope.anObjectName = "myObject";
    scope[scope.anObjectName].value++;

    console.log(scope.myObject.value);
})();

Локальный: v2

(function() {  
    var scope = this;

    scope.myObject = { value: 0 };
    scope.anObjectName = "myObject";
    scope[scope.anObjectName].value++;

    console.log(scope.myObject.value);    
}).call({});

Ответ 2

Объект существует в некоторой области видимости, поэтому вы почти всегда можете получить доступ к переменной через этот синтаксис:

var objname = "myobject";
containing_scope_reference[objname].some_property = 'some value';

Единственное место, где это становится сложным, - это когда вы находитесь в закрытой области и хотите получить доступ к локальной переменной верхнего уровня. Когда у вас есть что-то вроде этого:

(function(){
    var some_variable = {value: 25};
    var x = "some_variable";
    console.log(this[x], window[x]); // Doesn't work
})();

Вы можете обойти это, используя eval вместо этого, чтобы получить доступ к текущей цепочке цепочки... но я не рекомендую ее, если вы не провели много испытаний, а вы знаете, что что лучший способ заниматься вещами.

(function(){
    var some_variable = {value: 25};
    var x = "some_variable";
    eval(x).value = 42;
    console.log(some_variable); // Works
})();

Лучше всего иметь ссылку на имя в объекте "всегда будущий быть" (например, this в глобальной области или частной переменной верхнего уровня в локальной области) и поместить все еще там.

Таким образом:

var my_outer_variable = {};
var outer_pointer = 'my_outer_variable';
// Reach my_outer_variable with this[outer_pointer]
// or window[outer_pointer]

(function(){
    var my_inner_scope = {'my_inner_variable': {} };
    var inner_pointer = 'my_inner_variable';
    // Reach my_inner_variable by using
    // my_inner_scope[inner_pointer]
})();

Ответ 3

Является ли это глобальной переменной? Если это так, они фактически являются частью объекта window, поэтому вы можете сделать window[objname].value.

Если он локален для функции, я не думаю, что есть хороший способ сделать то, что вы хотите.

Ответ 4

Вы не можете сделать это вообще, за исключением области окна, где вы можете написать window[objname].value = 'value';

Ответ 5

Вы можете использовать eval:

eval(variablename + ".value = 'value'");

Ответ 6

Я думаю, что ответ Shaz для локальных переменных трудно понять, хотя он работает для нерекурсивных функций. Вот еще один способ, который я считаю более ясным (но это все еще его идея, точное то же поведение). Он также не получает доступ к локальным переменным динамически, просто свойство локальной переменной.

По существу, он использует глобальную переменную (прикрепленную к объекту функции)

// Here  a version of it that is more straight forward.
function doIt() {
    doIt.objname = {};
    var someObject = "objname";
    doIt[someObject].value = "value";    
    console.log(doIt.objname);
})();

Это по существу то же самое, что создание глобального хранилища для переменной, поэтому вы можете получить к ней доступ как свойство. Создание глобального для этого - такой взлом.

Здесь более чистый хак, который не создает глобальных переменных, вместо этого использует локальную переменную.

function doIt() {
  var scope = {
     MyProp: "Hello"
  };
  var name = "MyProp";
  console.log(scope[name]);
}

См. Javascript: интерпретировать строку как ссылку на объект?

Ответ 7

Используйте квадратную скобку вокруг имени переменной.

var objname = 'myobject';
{[objname]}.value = 'value';

Ответ 8

При использовании окна [objname] убедитесь, что objname является глобальными переменными. В противном случае, когда-нибудь будет работать, и иногда это может случиться. Окно [ObjName].value.

Ответ 9

Если объект находится в некотором пространстве имен, т.е. Company.Module.Components.Foo вы можете использовать эту функцию:

CoffeeScript:

objByName: (name, context = window) ->
    ns = name.split "."
    func = context
    for n, i in ns
        func = func[n]
    return func

Результат Js:

objByName: function(name, context) {
  var func, i, n, ns, _i, _len;
  if (context == null) {
    context = window;
  }
  ns = name.split(".");
  func = context;
  for (i = _i = 0, _len = ns.length; _i < _len; i = ++_i) {
    n = ns[i];
    func = func[n];
  }
  return func;
}

Затем вы можете создать новый объект или сделать что угодно. Обратите внимание на партизацию.

var o = new (objByName('Company.Module.Components.Foo'))
objByName('some.deeply.nested.object').value

Эта идея заимствована из аналогичного вопроса: Как выполнить функцию JavaScript, когда у меня есть ее имя в виде строки

Ответ 10

var micro=[{'test':'hello'}];

var device = 'test';

console.log(micro[device]);