Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用reactjs和axios防止json数组重复_Javascript_Arrays_Json_Reactjs_Axios - Fatal编程技术网

Javascript 使用reactjs和axios防止json数组重复

Javascript 使用reactjs和axios防止json数组重复,javascript,arrays,json,reactjs,axios,Javascript,Arrays,Json,Reactjs,Axios,请看我与@Akrion的对话下面的评论,他帮助我解决了这个问题,并看到了解决方案 我对reactJS和axios都是新手,但之前我和一个同学试过一些东西,现在我被卡住了。我想从json文件中呈现运动类别,但相同的类别会多次出现。什么是一个很好的做法来整理重复的内容,以便只显示一次,例如足球 对不起,还是新来的。我一直在尝试一些东西,比如Javascript函数来排序。。。但我只是不知道该把代码放在哪里,我一直在兜圈子。如果我说的话让人困惑,请告诉我英语不是我的第一语言。这是我的密码: impor

请看我与@Akrion的对话下面的评论,他帮助我解决了这个问题,并看到了解决方案

我对reactJS和axios都是新手,但之前我和一个同学试过一些东西,现在我被卡住了。我想从json文件中呈现运动类别,但相同的类别会多次出现。什么是一个很好的做法来整理重复的内容,以便只显示一次,例如足球

对不起,还是新来的。我一直在尝试一些东西,比如Javascript函数来排序。。。但我只是不知道该把代码放在哪里,我一直在兜圈子。如果我说的话让人困惑,请告诉我英语不是我的第一语言。这是我的密码:

import React, { Component } from "react";
import axios from 'axios';

class SportsList extends Component {
  state = {
    posts: []
  }
  componentDidMount(){
    axios.get('https://json-file.json')
    .then(res => {
      this.setState({
        posts: res.data
      })
    })  
  }

  render() {
    console.log(this.props)
    const { posts } = this.state;
    const postList = posts.length ? (
        posts.map(post => {
          return (
            <div key={post.id}>
              <div>
                {post.sport}
              </div>
            </div>
          )
        })
      ) : (
        <div>No Sports Available</div>
      )
    return (
      <div> 
      {postList}
    </div>
    );
  }
}

export default SportsList;

可以在渲染之前(例如在设置状态之前)使用“减少”进行过滤运动

const sportsFiltered = sports.reduce((accum, sport) => {
    const accumulator = [...accum];
    if(!accumulator.some(item => item.id === sport.id)) {
        accumulator.push(sport);
    }
    return accumulator;
},[]);

class SportsList extends Component {
  state = {
    posts: []
  }
  componentDidMount(){
    axios.get('https://json-file.json')
    .then(res => {
      this.setState({
        posts: sportsFiltered(res.data)
      })
    })  
  }

  render() {
    console.log(this.props)
    const { posts } = this.state;
    const postList = posts.length ? (
        posts.map(post => {
          return (
            <div key={post.id}>
              <div>
                {post.sport}
              </div>
            </div>
          )
        })
      ) : (
        <div>No Sports Available</div>
      )
    return (
      <div> 
      {postList}
    </div>
    );
  }
}

理想情况下,您应该在服务器端修复数据,但也可以在前端删除重复的数据:

res.data.reduce((acc, post) => {
  const post1 = acc.find(x => x.sport === post.sport);
  if (!post1) {
    acc.push(post1);
  }
  return acc;
}, []);

这不是最有效的方法,但它很简单。

您也可以通过Array.reduce按帖子id进行分组,然后获取值。将渲染更改为:


使用集合而不是基本数组。就在渲染之后{?我只得到运动还没有定义。我还没有很好地理解错误,但我得到了一个:./src/components/SportsList.js行19:解析错误:意外标记,应为17 |渲染{18 | const{posts}=this.state;>19 | const uniquePosts=Object.valuesposts.reducer,c=>r[c.id]=c,r,{}^20}const postList=uniquePosts.length?21 | uniquePosts.mappost=>{22 | return我想它缺少Object.values的右括号,我猜它在这行的末尾?如果我把它放在那里,我仍然会得到所有的重复项。对不起:dubs?uniquePosts正在获取它看起来像的所有现有匹配项。然后我得到:第18行:意外使用逗号运算符no sequences on“c,r,{}”啊,当然对不起。这里有点晚了……我试过了。仍然得到了所有的副本。今天再次看了看你的小提琴。在我的编辑器中写下了它,并对数据进行了一些更改,然后我在看r[c.id]时意识到了这一点=c我刚刚不得不将id改为sport。正在工作。感谢您的帮助!@Joel8bitar在您的setState:this.setState{posts}中使用此选项,其中posts是上述函数调用的返回值,因此只需将其替换为以下行:res.data after posts:?
render() {
    const { posts } = this.state;
    const uniquePosts = Object.values(posts.reduce((r,c) => { 
      r[c.id] = c 
      return r
    }, {}))
    const postList = uniquePosts.length ? (
        uniquePosts.map(post => {
          return (
            <div key={post.id}>
              <div>
                {post.sport}
              </div>
            </div>
          )
        })
      ) : (<div>No Sports Available</div>)
    return (<div>{postList}</div>);
  }
}
const newPosts = [...new Set(posts)]