【问题标题】:How to access object properties of 'key' object reactJS如何访问'key'对象reactJS的对象属性
【发布时间】:2019-03-01 02:27:58
【问题描述】:

想要输出这个 JSON 数据

我正在努力寻找一种方法来输出我从 Firebase 提取的这些数据,主要是因为我不知道如何选择“日期”对象中的对象。 Firebase 会自动生成这些密钥:-LMgzJGM78f0BHbPf8cc

我无法输出上述对象的属性^我尝试使用嵌套的for(in) 循环。

这是我目前使用的代码:

从数据库中提取数据

 componentDidMount() {
    axios.get('./tasks.json')
      .then(response => {
        const fetchedTasks = [];
        for (let date in response.data) {
          fetchedTasks.push({
            ...response.data[date],
            date: date,
          });
          for (let item in response.data[date]) {
            fetchedTasks.push({
              ...response.data[date[item]],
              id: item
            })
          }
        }
        this.setState((prevState, props) => {
          return {
            taskList: fetchedTasks,
            loading: false
          }
        })
      })
      .catch(error => console.log(error));
  }

将状态映射到 JSX 元素,仅输出类似 props.name:

  {this.state.taskList.map((array, index) => (
            <CompleteTask
              key={array.date}
              taskName={array.date}
            />
          ) )
        }

这是一个示例,数据为 JSON 文件,它在我的应用程序中设置为状态:

{
  "tasks" : {
    "09182018" : {
      "-LMgzJGM78f0BHbPf8cc" : {
        "hours" : 0,
        "end" : "2018-09-18T14:02:25.022Z",
        "minutes" : 0,
        "name" : "sadflkjdsalkf",
        "seconds" : 2,
        "start" : "2018-09-18T14:02:22.508Z"
      },
      "-LMgzaEYe0tcCjpxOuPU" : {
        "hours" : 0,
        "end" : "2018-09-18T14:03:38.635Z",
        "minutes" : 0,
        "name" : "safd",
        "seconds" : 2,
        "start" : "2018-09-18T14:03:36.353Z"
      }
    },
  }
}

关键元素的属性-LMgzaEYe0tcCjpxOuPU我不确定如何访问,这些数据是由我的应用程序中的另一部分创建的,我应该移动到更浅的状态以输出'小时','名称的属性'、mintutes 等,还是有办法像现在一样访问它?

非常感谢。

【问题讨论】:

    标签: javascript reactjs firebase firebase-realtime-database axios


    【解决方案1】:

    您是否在询问如何访问具有问题名称(例如 -LMgzJGM78f0BHbPf8cc)的属性?

    如果是这样,您可以使用方括号语法通过属性名称访问对象属性,而不是 object.property 表示法:

    let obj = { color: 'blue' }
    
    let prop = 'color'
    
    console.log(obj.color);
    console.log(obj['color']);
    console.log(obj[prop]);

    如果不是,请尝试更清楚地说明您当前的问题是什么。

    【讨论】:

      【解决方案2】:

      我建议以这种方式将从 Firebase 接收到的对象转换为数组:

      const formattedTasks = [];
      
      const tasks = Object.values(data.tasks);
      
      tasks.forEach(task =>
        Object.entries(task).forEach(([key, value]) =>
          formattedTasks.push({ name: key, data: value })
        )
      );
      

      因此,您将通过 formattedTasks 数组进行映射。

      这是一个工作示例:https://codesandbox.io/s/l348nnkv9q

      【讨论】:

        【解决方案3】:

        由于这些对象中的键是未知的,因此使用Object.keys() 可能会很有用。在你的 JSX 中尝试这样的事情:

        给定:

        const data = {
          "tasks" : {
            "09182018" : {
              "-LMgzJGM78f0BHbPf8cc" : {
                "name" : "Task One",
              },
              "-LMgzaEYe0tcCjpxOuPU" : {
                "name" : "Task Two",
              }
            },
          }
        };
        

        JSX:

        <ul>
            {Object.keys(data.tasks).map((date) => {
                const dayTasks = tasks[date];
                return Object.keys(dayTasks).map((key) => {
                    const task = dayTasks[key];
                    return (
                      <li>{task.name}</li>
                    )
                })
            })}
        </ul>
        

        【讨论】:

          【解决方案4】:

                    <div>
                     {
                        Object.entries(slot).map(([key, value]) =>
                        <div>
                          {console.log("key", key)}
                          <span>{key}</span>
                          <div>
                          
                          {value.map(g => (
                            <div>{console.log("g", g.eTime)}
                            <span>{g.eTime}</span>
                            </div>
                          ))}
                          </div>
                        </div>
                      )
                     }
                   </div>

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-09
          • 2021-03-05
          • 2019-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-11
          相关资源
          最近更新 更多