如何访问“关键”对象reactJS

时间:2018-09-25 12:47:23

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

要输出此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的属性我不确定如何访问,这些数据是由我应用中的另一部分创建的,如果我移到更浅的状态以输出“小时”的属性, 'name',minutes等。还是现在可以访问它?

非常感谢。

3 个答案:

答案 0 :(得分:1)

您是否要问如何访问名称有问题的属性,例如-LMgzJGM78f0BHbPf8cc

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

let obj = { color: 'blue' }

let prop = 'color'

console.log(obj.color);
console.log(obj['color']);
console.log(obj[prop]);

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

答案 1 :(得分:1)

由于这些对象中的键是未知的,因此使用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>

答案 2 :(得分:1)

我建议以这种方式将从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