使用JavaScript访问变量对象的属性

5

I have a js object that looks like this:

 var object = {
      "divisions": {
          "ocd-division/country:us": {
              "name": "United States",
          }
      }
    };

我想访问嵌套的对象下列出的属性"ocd-division/country:us"(也称为"name"),但我遇到的问题是"ocd-division/country"是一个变量对象。像加拿大这样的国家可能会使用 “:can”等内容。我的问题是,即使它是可变的,我是否仍然可以访问该对象下的名称属性? 我编写了如下的代码,但它调用了文本对象,因此无法考虑对象名称的更改。
    var country = document.getElementById("p");
    p.innerHTML = object.divisions["ocd-division/country:us"].name;

我是JavaScript的新手,如果这个问题很蠢,请原谅。


Object.keys(divisions) 可以解决你的问题。 - vinayakj
你如何决定我想要“ocd-division/country:us”还是其他内容?这个对象结构对于所有国家都是相同的吗? - RIYAJ KHAN
你控制这个结构吗?如果是的话,为什么要有一个无法预测的密钥呢?这样做就失去了意义。 - Lye Fish
divisions 对象下是否可能有多个项目?如果是这样,您需要获取所有项目还是只需要挑选特定的项目? - Lye Fish
@Lye Fish 是的,divisions 对象下有多个项目,而且很可能我在不久的将来需要挑选特定的项目。但是为了简洁起见,我现在省略了这部分内容。 - brohannsebastian
显示剩余2条评论
4个回答

7
当你不知道一个对象的属性时,可以使用下列方法:
  • for...in 循环

    它可以枚举对象自己的和继承来的可枚举属性。

  • Object.keys

    它返回一个数组,其中包含对象自己的所有可枚举属性的名称。

  • Object.getOwnPropertyNames

    它返回一个数组,其中包含对象自己的所有属性的名称。

// Adding properties: "ownEnumerable", "ownNonEnumerable",
// "inheritedEnumerable" and "inheritedNonEnumerable"
var obj = Object.defineProperties({}, {
  ownEnumerable: {enumerable: true},
  ownNonEnumerable: {},
});
Object.defineProperties(Object.prototype, {
  inheritedEnumerable: {enumerable: true},
  inheritedNonEnumerable: {},
});

// Display results
function log(id, arr) {
  document.getElementById(id).textContent = '[' + arr.join(', ') + ']';
}
log('forin', function(forInProps){
  for (var prop in obj) forInProps.push(prop);
  return forInProps;
}([]));
log('keys', Object.keys(obj));
log('names', Object.getOwnPropertyNames(obj));
<dl>
  <dt><code>for...in</code></dt><dd id="forin"></dd>
  <dt><code>Object.keys</code></dt><dd id="keys"></dd>
  <dt><code>Object.getOwnPropertyNames</code></dt><dd id="names"></dd>
</dl>


1
所有选项的好总结。大多数人忘记 for in 迭代可枚举的继承属性。 - Patrick Roberts
@Oriol,如果我添加一个演示这三个选项的编辑,该对象具有自己和继承的属性,包括可枚举和不可枚举的属性,这样可以吗? - Patrick Roberts
@PatrickRoberts 是的,加入一个例子是个好主意,我已经包含了它。如果你有更短或更清晰的例子,请随意编辑。 - Oriol
@PatrickRoberts 谢谢你提供的例子。对于初学者来说,看到一些与我正在做的相关脚本是很有帮助的。 - brohannsebastian

2
object.divisions[Object.keys(object.divisions)[0]].name

太棒了,这个对我很有用。我不知道Object.keys()也适用于字符串。谢谢! - brohannsebastian
1
有关更多信息,请参见@Oriol的答案,您可以使用其中任何一个。 - vinayakj

1
当然...
for (var division in object.divisions) {
    var name = object.divisions[division].name;
    // Do what you want with name here
}

如果对象具有原型方法,您将需要使用 Object.prototype.hasOwnProperty() 来确保它们不会像这样被迭代:
for (var division in object.divisions) {
    if (!object.divisions.hasOwnProperty(division)) continue;
    var name = object.divisions[division].name;
    // Do what you want with name here
}

如果您不关心IE8的支持并且要迭代它们,请使用Object.keys()

Object.keys(object.divisions).forEach(function(division) {
    var name = object.divisions[division].name;
    // Do what you want with name here
});

编辑:重新阅读您的问题后,我发现您可能已经知道了关键字,但是想要使用变量关键字访问对象,这也完全可以:

var division = 'ocd-division/country:us';
object.divisions[division].name;

当使用[]括号符号访问对象时,您可以插入任何求值为字符串的代码,甚至可以在其中调用返回字符串的函数。
请参见: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors

感谢您的解释! - brohannsebastian

0

你可以使用 for 循环遍历对象。

var obj = {
    "divisions":{
      "ocd-division/country:us":{
         "name" : "United States"
      }
    }
}

这是 for 循环

for(var a in obj){ //loop first the object
  for(var b in obj[a]){ // then second object (divisions)
    for(var c in obj[a][b]){ //then third object (ocd-division/country:us)
      if(c == 'name'){ //c is the key of the object which is name
        console.log(obj[a][b][c]); //print in console the value of name which is United States.
        obj[a][b][c] = "Canada"; //replace the value of name.
        var objName = obj[a][b][c]; //or pass it on variable. 
      }
    }
  }
}

console.log(obj); //name: Canada
console.log(objName); //name: United States

You can also use this reference:
https://developer.mozilla.org/enUS/docs/Web/JavaScript/Reference/Statements/for
https://dev59.com/Umsy5IYBdhLWcg3wzBF4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接