javascript - 如何映射每个对象值都有唯一 id 的对象并将这些值返回到 React 组件

标签 javascript arrays reactjs redux

我正在开发一个 redux 项目,我想检索存储在 API 服务器中的值。我想将来自 API 的数据存储在我的 redux 存储中,然后检索值并将其显示在我的 React 组件中。数据API 服务器中的数据以对象的形式存在,但每个值都有一个唯一的 id。因此,在我的例子中,数据是帖子列表。因此,每个帖子都有一个唯一的 id 并具有时间戳等所有其他详细信息、帖子标题、帖子作者等。这是帖子 API 中的默认数据的样子:

const defaultData = {
  "8xf0y6ziyjabvozdd253nd": {
    id: '8xf0y6ziyjabvozdd253nd',
    timestamp: 1467166872634,
    title: 'Udacity is the best place to learn React',
    body: 'Everyone says so after all.',
    author: 'thingtwo',
    category: 'react',
    voteScore: 6,
    deleted: false,
    commentCount: 2
  },
  "6ni6ok3ym7mf1p33lnez": {
    id: '6ni6ok3ym7mf1p33lnez',
    timestamp: 1468479767190,
    title: 'Learn Redux in 10 minutes!',
    body: 'Just kidding. It takes more than 10 minutes to learn technology.',
    author: 'thingone',
    category: 'redux',
    voteScore: -5,
    deleted: false,
    commentCount: 0
  }
}

注意:这里的“id”是一个随机数(例如“8xf0y6ziyjabvozdd253nd”),它会变成一个整数,即第一个帖子的 ID 为 1,第二个帖子的 ID 为 2。

因此,我可以将 posts API 中的数据存储在我的 redux“Store”中。我将 posts 对象转换为一个数组(因为我们无法映射对象),因为我想映射这个数组并在我的 React 组件中显示数据。但是,我无法在我的组件中看到数组的结果组件,也许这是因为它在数组中的每个对象之前都有一个 id。这就是我尝试映射数组的方式,我没有收到任何错误,但我没有看到组件中对象的结果。我的组件文件看起来像这样:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { fetchPosts } from '../actions';
import _ from 'lodash';

class PostsIndex extends Component {
  componentDidMount() {
    this.props.dispatch(fetchPosts())
    .then(() => {
      this.setState({
        loading : false
      });
    //  console.log(this.props.posts.posts[0])
    })
  }

  render() {
//  console.log(this.props.posts.posts)   
  const obj = this.props.posts.posts;
  let arr;
  if (obj) {
     arr = Object.values(obj); //Converting an Object into an array
  }
  console.log(arr);         //returns the converted array from an object

    return(
      <div>
              {
                arr               ?
                <div>
                { arr.map(post =>
                   {
                      <div>
                          {post.title}
                      </div>
                    })
                  }
                </div>
                                  :
                <div>
                  No Data
                </div>
              }
      </div>
    );
  }
}

function mapStateToProps(state) {
  return { posts: state.posts };
}

export default connect(mapStateToProps)(PostsIndex);

当我 console.log 我的状态时,转换后的数组如下所示:

array-of-the-converted-object

展开后的样子:

expanded-array

我想从上面的数组中检索几乎所有的值。任何人都可以告诉我如何从数组中获取数据并映射数组以显示我的 React 组件中的值吗?

最佳答案

您可以将数据保存为对象,并使用 Object.keys 获取键数组、映射键并使用键访问嵌套对象。如果您不知道数据源的形状,可以使用递归。

这是一个工作 code sandbox example我在其中获取了您的数据源并将其转换为表格来说明如何执行此操作。

这是代码:

import React from 'react';
import { render } from 'react-dom';
import Hello from './Hello';


const defaultData = {
  "8xf0y6ziyjabvozdd253nd": {
    id: '8xf0y6ziyjabvozdd253nd',
    timestamp: 1467166872634,
    title: 'Udacity is the best place to learn React',
    body: 'Everyone says so after all.',
    author: 'thingtwo',
    category: 'react',
    voteScore: 6,
    deleted: false,
    commentCount: 2
  },
  "6ni6ok3ym7mf1p33lnez": {
    id: '6ni6ok3ym7mf1p33lnez',
    timestamp: 1468479767190,
    title: 'Learn Redux in 10 minutes!',
    body: 'Just kidding. It takes more than 10 minutes to learn technology.',
    author: 'thingone',
    category: 'redux',
    voteScore: -5,
    deleted: false,
    commentCount: 0
  }
}

const TableHeader = ({ fields }) => (
  <thead>
    <tr>
    {
      fields.map( field => <th key={ field }>{ field }</th>)
    }
    </tr>
  </thead>
);

const TableBody = ({ data }) => (
  <tbody>
    {
      Object.keys(data).map(
        datum =>
          <tr>
          {
            Object.keys(data[datum]).map(
              field => <td>{data[datum][field]}</td>
            )
          }
          </tr>
      )
    }
  </tbody>
);

const App = () => (
  <table>
    <TableHeader fields={ Object.keys(defaultData[Object.keys(defaultData)[0]]) } />
    <TableBody data={defaultData} />
  </table>
);

render(<App />, document.getElementById('root'));

关于javascript - 如何映射每个对象值都有唯一 id 的对象并将这些值返回到 React 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47860931/

相关文章:

javascript - 第二次 axios api 调用时出现 GET 错误 400 错误请求

javascript - 选择多个包含文本的容器并 trim 前 150 个字符

python - 如何有效地将方形 numpy 数组旋转不同时间 `np.rot90` ?

c++ - 检查 Int 是否在数组中 C/C++

c++ - 如何在成员初始化器列表中初始化数组

javascript - React-native 不应该只渲染与 React 工作方式类似的更改组件吗?

javascript - 本地主机不存在 Access-Control-Allow-Origin

javascript - 避免模​​糊事件的完美方法

javascript - 如果放置了光标,则在光标位置的文本区域中插入文本,否则文本应最后附加在 IE 中

ReactJS+FireStore 数据映射问题