首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复React中的"TypeError: categories.map is not a function“错误

如何修复React中的"TypeError: categories.map is not a function“错误
EN

Stack Overflow用户
提问于 2019-05-03 07:35:39
回答 2查看 2.7K关注 0票数 3

我一直收到这样的错误:categories.map不是一个函数,但我不明白为什么。我正在为从API调用接收到的数据设置类别,但一直收到此错误。另外,有没有一种方法可以轻松地调用父对象的子对象?API数据的嵌套深度约为4-5层,它们都有不同的名称,那么我该如何遍历所有这些数据呢?

response.data在控制台中的外观示例(打开了一些嵌套对象)

下面是我的组件:

代码语言:javascript
复制
class Menu extends React.Component {
  state = {
    categories: []
  };

  componentDidMount() {
    axios
      .get("https://www.ifixit.com/api/2.0/categories")
      .then(response => this.setState({ categories: response.data }));
  } 

  render() {
    let categories = this.state.categories;
    return (
      <div>
        <ul>
          {categories.map((m, index) => {
            return (
              <li key={index}>
                {m.children && <Menu categories={m.children} />}
              </li>
            );
          })}
        </ul>
      </div>
    );
  }
}

export default Menu;

编辑:当我使用Object.keys时,它给我一个错误:“未捕获的不变冲突:对象作为React子对象无效(发现:带有键的对象...)”然后列出我要调用的对象中的所有键。有谁知道我如何调用这个函数(可能是递归的?)将其应用于对象中的所有对象?

下面是我更新的代码:

代码语言:javascript
复制
class Menu extends React.Component {
  state = {
    collapsed: false,
    categories: []
  };

  componentDidMount() {
    axios
      .get("https://www.ifixit.com/api/2.0/categories")
      .then(response => this.setState({ categories: response.data}));
  } 

  render() {
    const { categories } = this.state;
    return (
      <div>
        {Object.keys(categories).map((item, i) => (
          <li key={i}>
            <span>{categories[item]}</span>
          </li>
        ))}
      </div>
    );
  }
}

export default Menu;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-03 07:42:48

您可以将属性对象映射到数组并处理它。

代码语言:javascript
复制
let result = Object.entries(data).map(( [k, v] ) => ({ [k]: v }));

更改为

代码语言:javascript
复制
componentDidMount() {
    axios
      .get("https://www.ifixit.com/api/2.0/categories")
      .then(response => this.setState({ 
       categories: Object.entries(response.data).map(( [k, v] ) => ({ [k]: v }) }));
  } 
票数 3
EN

Stack Overflow用户

发布于 2019-05-03 07:43:24

问题是response.data不是array,而是一个json对象。

您可以使用以下代码基于键进行映射:

代码语言:javascript
复制
Object.keys(categories).map((key, index) => {
  console.log(categories[key]);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55961507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档