【问题标题】:How to access JSON array values without using index如何在不使用索引的情况下访问 JSON 数组值
【发布时间】:2019-12-25 18:23:54
【问题描述】:

我已向返回 JSON 数组的 API 发出请求,如下所示:

我的最终目标是获取属性“状态”并找到State: "PR" (或其他状态。我从用户下拉列表中获取状态输入)的所有“事件名称”(s)并将其放入列表中.

我知道我可以使用索引(例如:event_data[0].State 返回“PR”)来获取各个属性,但是如何避免使用索引来获取所有 State 值(或 EventName 值)整个阵列?或者这甚至是明智的? 我已经尝试过以下方法,但它似乎只是抓住了所有 EventName 值,而不仅仅是“PR”的值。预期的输出应该是“PR”的事件名称列表,例如pr_list = ["Debby 2000", "Dean 2001", "Jeane 2004" ... "Maria 2017"];

pr_list = [];
for (i = 0; i < event_data.length; i++) {
  state_data = event_data[i].State;
  if (state_data = "PR") {
    console.log(event_data[i].EventName)
    pr_list.append(event_data[i].EventName);
  }
}

【问题讨论】:

  • 请分享预期输出
  • 你在 if 语句中缺少 ==:if (state_data = "PR") - 你正在执行分配,而不是比较,这就是为什么它需要所有 eventName 而不仅仅是那些状态等于“公关”

标签: javascript arrays json parsing


【解决方案1】:

您可以为此使用Array.filter()Array.map()

filtered_events = event_data.filter(event => (event.State === "PR"));
pr_list = filtered_events.map(event => event.EventName);

关于您现有的代码 - 您有一个错字:

if (state_data = "PR") { ... }

应该是:

if (state_data === "PR") { ... }

(more info on MDN)

【讨论】:

  • 这在前面很有效,但我只想要“PR”列表中的 EventName 值。 pr_list = event_data.filter(event.EventName =&gt; (event.State === "PR")) 不过不太好用。
  • @gwydion93 我注意到,在我发布我的答案后 - 它现在应该做你想做的事
  • 效果很好! filter 是关键。
【解决方案2】:

您可以为此使用Array.filter()Array.map()

pr_list = event_data.filter(event => (event.State === "PR")).map(event => event.EventName)

为了唯一性,请使用Set

pr_list = [...new Set(event_data.filter(event => (event.State === "PR")).map(event => event.EventName))]

【讨论】:

    【解决方案3】:

    原生方式

    const finalArray = [];
    const event_data = [{ EventName: 'Event1', State: 'PR' }, { EventName: 'Event2', State: 'PQ' }];
    for (i = 0; i < event_data.length; i += 1) {
      element = event_data[i];
      if (element.State === "PR") {
        finalArray.push(element.EventName);
      }
    }
    console.log(finalArray);

    ES6 方式

    const event_data = [{ EventName: 'Event1', State: 'PR' }, { EventName: 'Event2', State: 'PQ' }];
    const finalArray = event_data.filter((f) => {
      return f.State &&
        f.State === 'PR';
    }).map((m) => { return m.EventName; });
    console.log(finalArray);

    【讨论】:

      【解决方案4】:

      您可以使用array.filter() 函数获取列表状态为PRarray.map() 函数获取列表中的所有eventId

      var array = [
        {eventId: '1', State: 'PR'},
        {eventId: '2', State: 'AR'},
        {eventId: '3', State: 'PR'}
      ];
      
      // get all event with State is PR
      array = array.filter(function (event) {
        return event.State === "PR";
      });
      
      // put all eventId in new array
      var eventIds = array.map(function (event) {
         return event.eventId
      });
      
      console.log('eventIds:', eventIds);

      【讨论】:

      • 我喜欢这个解决方案。我会改用 eventName,但拥有一个新数组而不仅仅是一个列表可能会很有用。
      • 好的,这是演示代码,所以它可能并不完美。很高兴知道您喜欢这个解决方案。
      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 2016-06-26
      • 2017-04-27
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2021-01-26
      • 2020-12-09
      相关资源
      最近更新 更多