#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;
}
Вы также можете использовать карту для более быстрого поиска идентификатора и возвращать значения. Однако это может изменить порядок вставки.
Следует иметь в виду, что этот геттер мутирует сам по себе; Не отличный дизайн.