【问题标题】:Javascript - Find multiple values in multidimensional arrayJavascript - 在多维数组中查找多个值
【发布时间】:2015-10-05 23:40:47
【问题描述】:

得到了一些我需要通过的 JSON 来获取一些 ID。 JSON 如下所示:

var carousel = [
  {
    "acf": {
      "content": [
        {
          "acf_fc_layout": "custom",
          "content": "Some text"
        },
        {
          "acf_fc_layout": "exhibition",
          "exhibition": 2594
        },
        {
          "acf_fc_layout": "exhibition",
          "exhibition": 1234
        }
      ]
    },
  }
]

对于每个content 其中acf_fc_layout == exhibition,我必须获取展览的值(ID),以便可以使用它来获取更多数据。如您所见,还有多个展览 ID。

我的困惑是对象和数组都有,而且它们是嵌套的。我用 jQuery 做过一些类似的事情,但这次是不可能的。不要认为我需要 IE8 支持,但仍然觉得这很棘手..

【问题讨论】:

    标签: javascript arrays loops object multidimensional-array


    【解决方案1】:

    如果你的 JSON 看起来像你说的那样,这是一个简单的解决方案:

    var i;
    for (i = 0; i < carousel[0].acf.content.length; i++) {
        if (carousel[0].acf.content[i].acf_fc_layout === "exhibition") {
            // do something with carousel[0].acf.content[i].exhibition
        }
    }
    

    或者,如果您的 JSON 中有更多内容,这可能是相关的:

    var i, j;
    for (i = 0; i < carousel.length; i++) {
        if (typeof carousel[i].acf != 'undefined' && typeof carousel[i].acf.content != 'undefined') {
            for (j = 0; j < carousel[i].acf.content.length; j++) {
                if (carousel[i].acf.content[j].acf_fc_layout === "exhibition") {
                    // do something with carousel[i].acf.content[j].exhibition
                }
            }
        }
    }
    

    【讨论】:

    • 您能否详细说明第二种解决方案?为什么我有更多内容会更好?
    • 这将遍历 JSON 中的所有数据,因此如果轮播(顶级列表)中有多个元素匹配一个元素的格式(carousel[i].acf.content [j].acf_fc_layout),第二个解决方案将允许您访问其他元素的展览 ID。
    • 浏览器兼容性?我只使用基本的 JavaScript 结构,据我所知,它应该在任何支持 JavaScript 的东西上运行。我不是 JavaScript 专家,但如果你能找到支持 JavaScript 但不支持该代码的浏览器,我会感到震惊。
    【解决方案2】:

    http://jsfiddle.net/oucp3v5x/

    $(carousel).each(function(i, el){
    
        $(el.acf.content).each(function(i, el){
            if(el.acf_fc_layout === 'exhibition') {
                $('<div>', {
                    text: el.exhibition
                }).appendTo($('#results'));
            }
        });
    
    });
    

    如果acf 有很多content,则需要运行额外的循环并且acf 必须是对象数组。

    【讨论】:

    • acf 是一个关联数组。关联数组不能有多个同名键,所以不能有“很多content”。
    • "并且 acf 必须是对象数组。"我评论的关键词。这是一个小费。
    【解决方案3】:

    对于您当前的结构,您需要使用 foreach 并检查值。

     var carousel = [
      {
        "acf": {
          "content": [
            {
              "acf_fc_layout": "custom",
              "content": "Some text"
            },
            {
              "acf_fc_layout": "exhibition",
              "exhibition": 2594
            },
            {
              "acf_fc_layout": "exhibition",
              "exhibition": 1234
            }
          ]
        },
      }
    ];
    
    $.each(carousel[0].acf.content,function (i,v){
        if(v.acf_fc_layout == "exhibition")
            $(".result").append(v.exhibition+"<br>");
        });
    

    JSFIddle

    【讨论】:

      【解决方案4】:
      carousel[0].acf.content.forEach(function (item) {
        if (item["acf_fc_layout"] === "exhibition") {
          // do some stuff
          // id for exhibition placed in item["exhibition"] 
        }
      });
      

      【讨论】:

      • 啊,很简单。适用于 IE9> 我想?
      • MDNcaniuse 都说是,forEach 从 IE9 开始工作。
      • for (var i = 0; i
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2015-09-28
      • 1970-01-01
      • 2013-04-12
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多