Цикл по объекту javascript с эффектом дросте
Я получил комментарии в комментариях внутри комментариев в объекте (очень похоже на эффект дросте). Для каждого комментария необходимо выполнить определенное действие. Комментарии могут продолжаться до бесконечности. Как мне зациклить их?
Например
Comments
randcomment1
text: "Not important"
uid: 1234
Comments
randsubcomment1
text: "again ni"
uid: 5346
randsubcomment2
text: "ni"
uid: 9087
randcomment2
text: "N.I"
uid: 4567
Мне нужно получить идентификатор каждого комментария, использовать его для вызова базы данных, а затем добавить третью пару ключ / значение в комментарий.
например
inidviualcomment
text: "ni"
uid: 4567
nickname: "Mr example" <------ this one should be added based on the uid
Что у меня сейчас
// using firebase and vuejs, not relevant
for (let key in val){
db.ref("users/" + val[key].uid).once("value").then(function(snapshot){
let value = snapshot.val()
let nickName = value.nickname
this.$set(val[key], "nickName", nickName)
}.bind(this))
//
// here you could add
// if (typeod val[key][Comments] != "undefined"){
// for (key in val[key][comments]){
// and so on, but this is not sustainable
// }
// }
//
}
Как мне прокрутить комментарии таким образом, чтобы не имело значения, сколько комментариев в комментариях?
1 ответ
Вам нужна рекурсивная функция. Примерно так должно работать:
Вы также можете сделать это функциональным и устранить возможные побочные эффекты.
/**
* First function: get all uids
* @param {array} uids
* @param {object} comments
* @returns {void}
*/
function addUids(uids, comments) {
comments.forEach(function(comment){
if (uids.indexOf(comment.uid) === -1) {
uids.push(comment.uid);
}
if (typeof comment.comments !== "undefined") {
addUids(uids, comment.comments);
}
});
}
/**
* Second function: transform comments storage and add nicknames
* @param {object} nicknames
* @param {object} comments
* @returns {void}
*/
function addNicknames(nicknames, comments) {
comments.forEach(function(comment){
comment.nickname = nicknames[comment.uid] || null;
if (typeof comment.comments !== "undefined") {
addNicknames(nicknames, comment.comments);
}
});
}
var uids = [];
addUids(uids, allComments);
// fetch nicknames - make some ajax call (fetch) and return something like:
var nicknames = {"uid1": "nickname1", "uid2": "nickname2"};
addNicknames(nicknames, allComments);
(Извините, я не тестировал код, вам придется сделать это самостоятельно, я думаю, вы получите представление о рекурсивной функции, и у меня сейчас не так много времени)