【问题标题】:JavaScript for-in loop with dynamic property names具有动态属性名称的 JavaScript for-in 循环
【发布时间】:2014-02-10 01:06:10
【问题描述】:

我想遍历services_raw_nl 下的所有值并获取属于这些值的名称和编号,例如 内部餐饮和 9 和 现场音乐和 6

我想使用 for-in 循环,但有两个问题:

  1. 问题是services_raw_nl 的名称也可能是services_raw_en(取决于用户选择的语言)。
  2. 我不确定如何访问属性及其值。基本上我只想通过索引获取services_raw_nl 下属性的名称和值。

我想将其作为 JSFiddle 提供,但不知道如何在其中提供 JSON 数据,并且由于该服务尚未上线,我无法从 JSFiddle 调用它。

{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "facet":"true",
      "sort":"membervalue desc",
      "fl":"id,city,thumb",
      "facet.mincount":"1",
      "indent":"on",
      "start":"0",
      "q":["*:*",
        "*:*"],
      "facet.field":["country_raw_nl",
        "services_raw_nl",
        "city"],
      "wt":"json",
      "fq":"country_nl:=australie",
      "rows":"12"}},
  "response":{"numFound":10,"start":0,"docs":[
      {
        "id":"842",
        "city":"whitsundays",
        "thumb":"735_739_CEREMONY-PAVILLION-2.jpg"}]
  },
  "facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "country_raw_nl":[
        "Australie",10],
      "services_raw_nl":[
        "In-house Catering",9,
        "Live music",6],
      "partylocation":[
        "true",8,
        "false",2],
      "hasphoto":[
        "true",9,
        "false",1],
      "hasvideo":[
        "false",10],
      "rating":[
        "0.0",10],
      "rating_rounded":[
        "0.0",10],
    "facet_dates":{},
    "facet_ranges":{}}}

这是我正在尝试的循环:

for (var service in response.facet_counts.facet_fields.services_raw_nl) {
    console.log(response.facet_counts.facet_fields.services_raw_nl[service].???);
}

【问题讨论】:

  • 看起来services_raw_nl 是一个数组 而不是对象:["In-house Catering",9,"Live music",6],在这种情况下,您应该使用普通的for 循环,而不是for...in。我假设你知道如何迭代数组?
  • 如果 'In-house Catering' 与 '9' 配对,那么理想情况下它们将包含一个像 { name: 'In-house Catering', value: 9 } 这样的对象,并且您将拥有这些对象的数组,然后您可以循环访问这些对象。
  • @Andy:拥有{"In-house Catering": 9, "Live music": 6} 形式的对象可能更有意义。
  • @FelixKling:你是对的,它是一个数组,但是你将如何解决数组名称是动态的这一事实?例如带有后缀_nl_en?
  • 看起来具体的属性名称包含在facet.field属性中:["country_raw_nl", "services_raw_nl", "city"]。因此,您可以遍历该数组并获取以 services_raw 开头的字符串并将其用作属性名称。

标签: javascript json for-in-loop


【解决方案1】:

您可以将service_raw_nl/en 缓存到变量中,并使用简单的for 循环:

var lang = 'nl', // or 'en', this you probably have stored somewhere in your preceding code?
    services_raw = response.facet_counts.facet_fields['services_raw_' + lang],
    n;
for (n = 0; n < services_raw.length; n++) {
    console.log(services_raw[n]);
}

编辑

此函数返回一个包含所需值的对象。

var lang = 'nl';
function getServices (response, lang) {
    var services_raw = response.facet_counts.facet_fields['services_raw_' + lang],
        n, temp = {};
    for (n = 0; n < services_raw.length; n+= 2) {
        temp[services_raw[n]] = services_raw[n + 1];
    }
    return temp;
}
console.log(getServices(response, lang));

A live demo at jsFiddle.


编辑二

services_raw_nl 的值创建一些 HTML 的简单方法是这样的:

var lang = 'nl',
    services_raw = response.facet_counts.facet_fields['services_raw_' + lang],
    n, outer, inner;
for (n = 0; n < services_raw.length; n += 2) {
    outer = document.createElement('span');
    outer.appendChild(document.createTextNode(services_raw[n]));
    inner = outer.appendChild(document.createElement('span'));
    inner.appendChild(document.createTextNode(services_raw[n + 1]));
    what_ever_element.appendChild(outer);
}

【讨论】:

  • 啊,谢谢!您的代码检索标题和值,但我如何分别访问它们并将这些值分别分配给标题和计数变量?例如In-house Catering9。谢谢!
  • 我不确定你现在在问什么。上面的代码给你“...the name and value of a property under services_raw_nl by their index."。也许你想创建一个对象?我会编辑答案...
  • 我想我不确定这一行console.log(services_raw[n]) 的作用,因为我在控制台中看到了属性的名称,在下一行看到了该属性的值。我会说上述行只打印名称+值。我不需要对象,但希望看到打印 2 条控制台行的代码:1 表示属性名称,1 表示值,一旦我有了,我就可以在其他地方使用这些值。清楚我不清楚的地方吗? :)
  • getServices() 返回一个对象。 services_raw_nl 数组中有四个值,如果不使用数组或对象,就不能将它们放入两个变量中。您究竟想要来自services_raw_nl 的值? getServices() 也可以返回一个对象数组...
  • 您可以在我最后的评论中使用小提琴。或者只是创建一个数组,并以与我在第二个 sn-p (n += 2) 中迭代 services_raw 相同的方式对其进行迭代。
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 2012-11-18
  • 2012-11-11
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
相关资源
最近更新 更多