Получить данные на основе отфильтрованного массива - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь отфильтровать массив, основанный на сравнении post.id, получить значение и добавить его в свойство likes.

action.data.filter((post) => post.id === action.id).Likes.length

не работает так, как я думалбы, дает мне ошибку, что длина не определена

, если я сделаю что-то вроде

 action.data.filter((post) => post.id === 5)

, это даст мне результат, который я ищу, но это не сработает, нужнобыть динамичным

return {
  ...state, 
  posts: action.data, // maps posts fine,
  likes: action.data.filter((post) => post.id === action.id).Likes.length // does not do what i want it do :(
 }

Он должен быть динамическим, чтобы любое значение для этого конкретного сообщения имело свое собственное значение.Что я должен сделать вместо этого или что может быть решением?

, когда он называется {this.props.likes}

action.id (получает существующие идентификаторы сообщений)

console.log(action.id)

Выводит это

[5,2]

Публикует вывод данных этого

(2) [{…}, {…}]
 0:
  Likes: (32) 
  createdAt: "2019-04-26T09:38:10.324Z"
  id: 5
  post_content: "ssss"
  title: "React Interview Questionsdd"
  updatedAt: "2019-04-26T09:38:10.324Z"
  userId: 1
  username: "owlmans"
  __proto__: Object
 1: {id: 3, title: "React Interview sssQuestions", post_content: "ggg", 
  username: "owlman", createdAt: "2019-04-24T20:48:36.710Z", …}
  length: 2
  __proto__: Array(0)

Actions.js

export const GetPosts = () => {
    return (dispatch, getState) => {
        return Axios.get('/api/posts/myPosts')
            .then( (res) => {
                 const data = res.data
                 const id = data.map( (post) => post.id)  // gets posts id [5,3]
                 dispatch({type: GET_POSTS, data, id})
             })

    }
}

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Попробуйте это

const filtered = action.data.filter((post) => action.id.includes(post.id))

return filtered.map((post,index) => `post ${index} has ${post.Likes.length} likes`)

0 голосов
/ 26 апреля 2019

То есть вы хотите знать, сколько сообщений было в лайке?или общее количество каждого сообщения?

Так что, если вы хотите получить сумму лайков, вы можете использовать `` `уменьшить``.

Проверьте документы здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

Кроме того, похоже, что не у каждого объекта есть свойство Likes, поэтому вы должны проверить его.

let totalNumberOfLikes = action.data.posts.reduce( acc, post =>{

 if(post.id == action.id && post.hasOwnProperty('Likes'){
    acc += post.Likes.length
 }
} , 0 );


return {
  ...state, 
  posts: action.data,
  likes: totalNumberOfLikes }

Если вы хотите получить лайки для каждого поста, который у вас есть, помните, что filterвозвращает массив, поэтому вы проверяете свойство Likes массива отфильтрованных сообщений.

Вам нужно проверить свойство Likes каждого сообщения, а не массив отфильтрованныхсообщений.

Так что вместо: action.data.filter((post) => post.id === action.id).Likes.length.Вы можете сделать что-то вроде этого:

let filteredPosts = action.data.posts.filter( post => post.id == action.id );

let totalLikesForEachPost  =  {}; 

//Here you need an object to keep the record of every like in the post if this has any and an id so you can access the data.
filteredPosts.forEach( post => {
  totalLikesForEachPost[ post.id ] = {  
       totalLikes: post.hasOwnProperty('Likes') ? post.Likes.length : 0,
       id: post.id,
  }
} );


return {
  ...state, 
  posts: action.data,
  likes: totalLikesForEachPost }
0 голосов
/ 26 апреля 2019

Фильтр возвращает массив отфильтрованных данных .. поэтому, когда вы отфильтровали доступ к нулевому индексу для получения длины лайков

Для суммы лайков:

    action.data.filter((post) => action.id.includes(post.id)).reduce((a,b) => {
     return a.Likes.length + b.Likes.length
    })

Для рассеянных лайков:

    action.data.filter((post) => action.id.includes(post.id)).map((a) => {
     return { postlikes: a.Likes.length }
    })

Подробнее читайте фильтры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...