я хочу получить комментарий один раз, потому что он повторяется несколько раз

#javascript #node.js #vue.js #vuejs2 #socket.io

#javascript #node.js #vue.js #vuejs2 #socket.io

Вопрос:

на стороне сервера: вот на стороне сервера, где я получаю комментарий

 db.postSchema
              .findOne({ _id: comment.post })
              .populate("owner")
              .exec((err, users) => {
                for (let i = 0; i < array_of_connection.length; i  ) {
                  for (let j = 0; j < users.owner.friends.length; j  ) {
                    if (array_of_connection[i]._id == users.owner.friends[j]) {
                      array_of_connection[i].emit("new-comment", comment);
                    }
                  }
                }
              });
 

на стороне клиента:
и здесь, где прослушивается новый комментарий: post.vue

 created() {
   
   this.socket.on('new-comment',  data => {
     this.$store.commit('addComment', data)
   })
 

проблема здесь, когда я удаляю повторяющиеся комментарии: index.js

 getPosts(state) {
      let unique = [...new Set(state.posts)];

      for (let i = 0; i < unique.length; i  ) {
        for (let j = 0; j < unique[i].comments.length; j  ) {
          for (let k = 0; k < unique[i].comments.length - 1; k  ) {
            if (unique[i].comments[j]._id == unique[i].comments[k]._id) {
              unique[i].comments.splice(k, 1);
            }
          }
        }
      }
      return unique;
    }
 

Ответ №1:

Попытка объединить массив, который вы повторяете, обычно не является хорошей идеей. Могу ли я предложить добавить комментарии в массив, а затем вернуть его.

 getPosts(state) {
 function removeDuplicateComments(post) {
  let ret = []
  post.comments.forEach(it=> {
    if (!ret.find(it2=>it2._id == it._id) {
      ret.push(it);
    }
  })
  post.comments=ret;
 }
 
 let unique = [...new Set(state.posts)];
 unique.forEach(removeDuplicateComments);

 return unique;
}
 

Вы также можете использовать карту для более быстрого поиска идентификатора и возвращать значения. Однако это может изменить порядок вставки.

Следует иметь в виду, что этот геттер мутирует сам по себе; Не отличный дизайн.