Pregunta Javascript usa la variable como nombre del objeto


Quiero usar el valor de una variable para acceder a un objeto.

Digamos que tengo un objeto llamado myobject.

Quiero llenar una variable con este nombre y usar la variable para acceder al objeto.

Ejemplo:

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

74
2018-05-21 22:32


origen


Respuestas:


Global:

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

console.log(this[anObjectName]);

Global: v2

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

console.log(myObject)

Local: 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);
})();

Local: v2

(function() {  
    var scope = this;

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

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

106
2018-05-21 22:34



El objeto existe en algún ámbito, por lo que casi siempre puede acceder a la variable a través de esta sintaxis:

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

El único lugar donde esto se complica es cuando estás en un ámbito cerrado y quieres acceder a una variable local de nivel superior. Cuando tienes algo como esto:

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

poder superar eso mediante el uso de eval en su lugar, para acceder a la cadena de alcance actual ... pero no lo recomiendo a menos que haya realizado muchas pruebas y saber esa es la mejor manera de hacer las cosas.

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

Tu mejor La apuesta es tener una referencia a un nombre en un objeto que siempre va a estar allí (como this en el ámbito global o una variable privada de alto nivel en un ámbito local) y poner todo más allá.

Así:

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]
})();

7
2018-05-21 22:40



¿Es una variable global? Si es así, estos son en realidad parte de la window objeto, para que pueda hacer window[objname].value.

Si es local para una función, no creo que haya una buena manera de hacer lo que quieras.


6
2018-05-21 22:33



No puede hacer esto en general, excepto en el alcance de la ventana, donde puede escribir window[objname].value = 'value';


5
2018-05-21 22:34



Podrías usar eval:

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

5
2018-05-21 22:36



Creo que la respuesta de Shaz para las variables locales es difícil de entender, aunque funciona para funciones no recursivas. Aquí hay otra forma en que creo que es más claro (pero sigue siendo su idea, exactamente el mismo comportamiento). Tampoco está accediendo dinámicamente a las variables locales, solo la propiedad de la variable local.

Esencialmente, está usando una variable global (adjunta al objeto de función)

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

Que es esencialmente lo mismo que crear un global para almacenar la variable, para que pueda acceder a ella como una propiedad. Crear un global para hacer esto es un hack.

Aquí hay un truco más limpio que no crea variables globales, sino que usa una variable local.

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

Ver Javascript: interpretar cadena como referencia de objeto?


3
2018-06-08 18:37



Use el corchete cuadrado alrededor del nombre de la variable.

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

3
2018-05-13 09:37



Al usar la ventana [nombre_obj], asegúrese de que el nombre_objeto sea variables globales. De lo contrario, funcionará en algún momento, y fallará a veces. ventana [objname] .value.


0
2018-02-08 04:31



Si el objeto está en algún espacio de nombres, es decir. Company.Module.Components.Foo puedes usar esta función:

CoffeeScript:

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

Resulted 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;
}

Entonces puedes crear un nuevo objeto o hacer lo que sea. Tenga en cuenta el parenthises a través de.

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

Esta idea es tomada de una pregunta similar: Cómo ejecutar una función de JavaScript cuando tengo su nombre como una cadena


0
2018-06-04 16:49



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

var device = 'test';

console.log(micro[device]);

-1
2017-09-14 15:43