JavaScript中如何获取JSON对象的成员名称

7

这可能是一个非常基础的问题,但似乎很难找到答案。 我有一个Json,大致如下:

languages = {
"aa":{"iso639-2T":"aar","family":"Afro-Asiatic","labels":{"language_names":["Afar"],"native_names":["Afaraf"]}},
"ab":{"iso639-2T":"abk","family":"Northwest Caucasian","labels":{"language_names":["Abkhaz"],"native_names":["\u0430\u04a7\u0441\u0443\u0430"]}},
"af":{"iso639-2T":"afr","family":"Indo-European","labels":{"language_names":["Afrikaans"],"native_names":["Afrikaans"]}}, etc...etc... }

如果您看到上面的json,那么languages变量中有几个语言对象。每个语言对象都有自己的名称作为其标识符(“aa”,“ab”,“af”)。
那么,我的问题是,如果我想在HTML中列出所有这些语言,如何获取这些标识符(“aa”,“ab”,“af”)?例如,如果我想创建像组合框一样的东西(<option value="aa">Afar</option><option value="ab">Abkhaz</option><option value="af">Afrikaans</option>
实际上,我想要实现的是这样的(在php中)
$sampleArray = Array("aa" => "Afar", "ab" => "Abkhaz", "af" => "Afrikaans"); foreach($sampleArray as $id => $value){ /* I can get the id from $id* / }

是否有类似于php语法的解决方案可以用于JavaScript中的JSON?

附:如果你想知道为什么我不使用数组 - 我只是认为通过键名获取特定的语言对象会更容易(就像这样:languages["af"],以获取Afrikaans语言)而无需遍历整个语言对象并逐一检查ID是否符合要求,然后返回它。如果您有更好的建议,也可以给我提供其他建议 :)

最好的问候,

AnD


太好了,这个回答非常快,哈哈哈,谢谢大家帮我解决问题!*请看下面的答案 :) - AnD
5个回答

6

这应该可以满足您的需求。

要查看它们:

for (var lang in languages)
  alert(lang + ' : ' + languages[lang].labels.language_names[0]);

将它们放入DOM中。
var $select = $('selector to your select element');
for (var lang in languages)
  $select.append('<option value="'+lang+'">' + languages[lang].labels.language_names[0] + '</option>');

工作代码位于http://www.jsfiddle.net/EsJAh/


警告(lang + ' : ' + languages[lang].labels.language_names[0]) - James Westgate
@james,好眼力..我漏掉了数组..在答案中修复了。 - Gabriele Petrioli

3
你可以使用“for”语句。
for (var key in languages)
{
 alert(key);
}

2
var data = new Array();
for(var lang in languages) {
    data[lang] = languages[lang];
}

在这里使用 Array 是错误的。你应该使用 {},也就是 new Object(),它也可以与 Array 一起使用,但那只是因为你正在设置 Array 对象上的属性,实际上你并没有在 Array 中设置任何东西 :) - Ivo Wetzel
@Ivo - 我完全同意你的观点。看起来 OP 已经在 languages 对象中找到了他想要的东西,所以我想给他一些其他的建议。 - mellowsoon
Ivo的意思是,当你设置data["foo"] = "bar"时,你实际上并没有将键/值"foo" => "bar"添加到数组中。你实际上是将foo属性添加到数组对象中,即Array.foo = "bar"。虽然它在90%的情况下可以工作,但也有一些问题会出现。 - mellowsoon

2
你尝试过吗:
languages['af'].labels.language_names[0]

它将返回南非荷兰语。

我认为在这个例子中,他一开始就没有“af”。这就是他想要得到的。 - Keyslinger

0
如果你正在使用jquery,那么你实际上可以这样做:
$.each( languages, function(k, v){
        alert( "Key: " + k + ", Value: " + v );
        // value is your particular language object based on k variable
});

:)


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