Javascript는 변수를 개체 이름으로 사용


91

변수 값을 사용하여 개체에 액세스하고 싶습니다.

myobject라는 개체가 있다고 가정 해 보겠습니다.

이 이름으로 변수를 채우고 변수를 사용하여 개체에 액세스하고 싶습니다.

예:

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

답변:


125

글로벌 :

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

@Shaz-둘 다 실제로 동일한 범위를 참조합니다 ;-) (브라우저에서 실행된다고 가정합니다.) alert(this === window).
Sean Vieira

1
@PeeHaa 일 - 지역 예제에서 변수를 설정합니다 window라는 개체 objname를 통해 다음 참조 this하면 대체 할 수 ... window에 대한 this두 번째 예에서와 모든 작업을 계속합니다. :-)
Sean Vieira

1
@SeanVieira : 업데이트 된 예제를 살펴보십시오. 이제 제대로 작동하기를 바랍니다.
Shaz

1
@Shaz- arguments.callee더 이상 사용되지 않지만 그럼에도 불구하고 매우 영리한 구현 이며 글로벌 범위를 흩 뜨리지 않습니다 . +1
Sean Vieira

1
전역 범위를 오염시키지 않을 수 있지만 모든 함수 호출에서 공유되는 객체를 생성합니다. 함수는 objname함수 자체의 속성으로 유지 됩니다. 재귀 함수의 경우 실패 할 수 있습니다. 이것이 실제 세계에서 어떻게 사용될 수 있는지 확실하지 않습니다.
Juan Mendes

27

변수 이름 주위에 대괄호를 사용하십시오.

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

7
이것은 완벽하고 간단하며 최고의 답변이되어야합니다.
Brad

5
예외가 발생합니다. SyntaxError : expected expression, got '.'. 작동하지 않습니다; 왜 그렇게 많은 찬성 투표를합니까?
Lovro

9

전역 변수입니까? 그렇다면 실제로 window개체의 일부 이므로 window[objname].value.

함수에 국한된 경우 원하는 작업을 수행하는 좋은 방법이 없다고 생각합니다.


8

개체는 일부 범위에 있으므로 거의 항상 다음 구문을 통해 변수에 액세스 할 수 있습니다.

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

7

다음을 사용할 수 있습니다 eval.

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

eval고려 되지 evil않습니까? 그렇지 않다면 나는 그것을 사용할 수 있습니다. 지금은 글로벌이기 때문에 물건을 정리하는 함수로 옮기고 싶었습니다.
PeeHaa

1
Lol. 변수 이름이 사용자 입력에서 나온 경우 eval실행할 수 있는 JS 코드가 포함되지 않도록 유효성을 검사해야합니다 .
Midas

1
이것은 eval제 생각 에의 몇 안되는 합법적 인 사용 중 하나입니다 . 하지만 변수가 깨끗한 지 확인해야합니다.
Levi Morrison

2
네, 정말 문제가 아닙니다. 그러나 Shaz의 답변을 살펴보십시오. 나는 그것이 더 깨끗한 해결책이라고 생각합니다.
Midas

2
@PeeHaa : 이동을 고려하고 있다면 알려진 객체의 속성으로 이동하여 다음과 같은 작업을 수행 할 수 있습니다 myVar[objname].value.
JW.

6

일반적으로이 작업을 수행 할 수 없습니다. 창 범위를 제외하고는 다음을 작성할 수 있습니다. window[objname].value = 'value';


4

지역 변수에 대한 Shaz의 대답은 비 재귀 함수에서 작동하지만 이해하기 어렵다고 생각합니다. 더 명확하다고 생각되는 또 다른 방법이 있습니다 (하지만 여전히 그의 생각이고 똑같은 행동입니다). 또한 로컬 변수에 동적으로 액세스하지 않고 로컬 변수의 속성에 액세스합니다.

본질적으로 전역 변수 (함수 객체에 첨부)를 사용합니다.

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

이것은 본질적으로 변수를 저장하기 위해 전역을 생성하는 것과 동일하므로 속성으로 액세스 할 수 있습니다. 이를 위해 글로벌을 만드는 것은 그러한 해킹입니다.

다음은 전역 변수를 생성하지 않고 대신 지역 변수를 사용하는 깔끔한 해킹입니다.

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

참조 자바 스크립트 : 객체 참조와 같은 문자열을 해석?


1

개체가 일부 네임 스페이스에있는 경우 즉. 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 함수를 실행하는 방법


1
let players = [];
players[something] = {};
players[something].somethingElse = 'test';
console.log(players); 

-> [something : {somethingElse : 'test'}];


0

window [objname]을 사용할 때 objname이 전역 변수인지 확인하십시오. 그렇지 않으면 언젠가 작동하고 때로는 실패합니다. window [objname] .value.


0

제가 답변을하면서 겪었던 문제 중 하나는 객체가 단일 레벨이라고 가정한다는 것입니다. 예를 들면

const testObj = { testKey: 'testValue' }
const refString = 'testKey';
const refObj = testObj[refString];

잘 작동하지만

const testObj = { testKey:
                  { level2Key: 'level2Value' }
                }
const refString = 'testKey.level2Key';
const refObj = testObj[refString];

작동하지 않습니다.

내가 한 일은 다단계 개체에 액세스하는 함수를 만드는 것입니다.

objVar(str) {
    let obj = this;
    const parts = str.split('.');
    for (let p of parts) {
        obj = obj[p];
    }
    return obj;
}

두 번째 시나리오에서는 문자열을이 함수에 전달하여 찾고있는 개체를 다시 가져올 수 있습니다.

const testObj = { testKey:
                  { level2Key: 'level2Value' }
                }
const refString = 'testObj.testKey.level2Key';
const refObj = objVar[refString];

0

다음과 같이 개체 속성을 설정할 수 있습니다.

var obj = {};
obj.whateverVarName = 'yourVal';
console.log(obj);


0

가능한 변수 이름 목록을 이미 알고있는 경우 속성 이름이 개체 이름과 동일한 새 Object (iconObj)를 만들어보십시오. 아래 예제에서 iconLib 변수는 'ZondIcons'또는 'MaterialIcons'의 두 문자열 값을 보유합니다. . propertyName은 ZondIcons 또는 MaterialsIcon 객체의 속성입니다.

   const iconObj = {
    ZondIcons,
    MaterialIcons,
  }
  const objValue = iconObj[iconLib][propertyName]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.