Je travaille sur un programme JavaScript et j'ai besoin d'un objet pour revenir à la façade.
J'ai écrit des requêtes qui revenaient: p>
Je souhaite créer un nouveau tableau appelé photoarray, qui a les commentaires de chaque photo stockés en tant que sous-carré. p>
Ceci est la structure: p>
for(var i=0; i< photos.length; i++){
for(var j=0; j< comments.length; j++){
if(photos[i].id == comments[j].photoTarget){
//I can't get this part to work
}
}
}
5 Réponses :
Vous pouvez utiliser un Itéréter Cette approche utilise seulement deux boucles, Big O: O (N + M) P> Plan en réduisant le tableau des photos, où une nouvelle propriété Commentaires code> est assignée, qui correspond à la valeur de la carte. commentaires code> et Appuyez sur les données sur la carte de Poto attribuée. P> var photos = [{...}, {...}, ...],
comments = [{...}, {...}, ...],
photoMap = photos.reduce((m, p) => m.set(p.id, p.comments = []), new Map);
comments.forEach(c => photoMap.get(c.photoTarget).push(p));
Si, pour une raison quelconque, le tableau de commentaires a un élément avec une valeur phototarget qui n'est pas présente dans le tableau des photos, puis photomap.get (c.PhotoTarget) .Push (p) échouera.
@Karthikeyan, à droite, mais je suppose qu'il n'y a pas de trous. Mais même si oui, alors, en itérayant des commentaires, cela pourrait attribuer un nouveau jeu de données à des photos code> et ajout de l'ID à la carte aussi bien.
Tout d'abord, vous devez ajouter des commentaires Array en tant que propriété à l'objet Image
for(var i=0; i< photos.length; i++){
for(var j=0; j< comments.length; j++){
if(photos[i].id == comments[j].photoTarget){
photos[i].comments.push({comments[j].id, comments[j].text,
comments[j].photoTarget, comments[j].userOrigin, comments[j].name});
}
}
}
Cette approche a une complexité de la durée du temps de O (N * M), où un meilleur algo céderait O (n + m).
Itéréter via le tableau des photos et trouvez le commentaire correspondant et ajoutez-le au tableau de commentaires de l'objet Photo.
p>
var photos = [{id :1, owner:'test'}]
var comments = [{id:1, text:'test', photoTarget:1}, {id:2, text:'test1', photoTarget:1}]
var photoArray = []
for(var i=0; i< photos.length; i++){
var photo = photos[i];
for(var j=0; j< comments.length; j++){
if(photos[i].id == comments[j].photoTarget){
photo.comment = photo.comment ? photo.comment.concat(comments[j]) : [].concat(comments[j]); //Add a comment property and assign the matching comment object
}
}
photoArray.push(photo);
}
console.log(JSON.stringify(photoArray)); Une approche peut être à Filtre Code> Objets de commentaire pour chaque photo basée sur PhotoTarget Code> Comme vous construisez le tableau final: const photos = [{"id":1,"owner":"Spence","name":"eiusmod ex"},{"id":2,"owner":"Billie","name":"ullamco officia"},{"id":3,"owner":"Shannon","name":"duis ipsum"},{"id":4,"owner":"Marian","name":"excepteur ipsum"}];;
const comments = [{"id":0,"name":"Kendra","text":"reprehenderit sit sunt Lorem","photoTarget":3},{"id":1,"name":"Arline","text":"nisi aliqua in magna","photoTarget":4},{"id":2,"name":"Earlene","text":"proident ex cupidatat eu","photoTarget":3},{"id":3,"name":"Downs","text":"ullamco est veniam enim","photoTarget":1},{"id":4,"name":"Claire","text":"voluptate tempor velit laborum","photoTarget":4},{"id":5,"name":"Louise","text":"amet ea quis ipsum","photoTarget":2},{"id":6,"name":"Simpson","text":"qui velit in enim","photoTarget":1},{"id":7,"name":"Lavonne","text":"ea qui mollit adipisicing","photoTarget":4},{"id":8,"name":"Morris","text":"veniam aliquip esse nisi","photoTarget":1},{"id":9,"name":"Rosalinda","text":"consequat non culpa qui","photoTarget":2}];
const result = photos.map(p =>
Object.assign({}, p, { comments: comments.filter(c => c.photoTarget === p.id) }));
console.log(result);
J'ai réduit la matrice de commentaires dans un groupeGroupedbyPhoto (un objet où PhotoTarget sera la clé et une gamme de commentaires ayant le même phototarget), puis utilisé la fonction de carte sur les photos pour générer des photos de photo pour générer des photos non modifiées
var photos = [{id :1, owner:'owner1'},{id :2, owner:'owner2'},{id:3,owner:'owner3'}]
var comments = [{id:1, text:'comment1 for 1', photoTarget:1, userOrigin: 'Asia'}, {id:2, text:'comment2 for 1', photoTarget:1, userOrigin: 'America'}, {id:3, text:'only comment for 2', photoTarget:2, userOrigin: 'Europe'}]
var commentsGroupedByPhoto = comments.reduce(function(commentsObj, comment) {
var photoId = comment.photoTarget,
commentByPhotoTarget = commentsObj[photoId];
commentByPhotoTarget ? commentByPhotoTarget.push(comment) : commentsObj[photoId] = [comment];
return commentsObj;
}, {});
console.log('comments grouped by id --- ' + JSON.stringify(commentsGroupedByPhoto));
var photoArray = photos.map(function(photo){
var photoCopy = {photo}; //ES6 cloning
//if your codebase does not support ES6 then use
//var photoCopy = Object.assign({}, photo);
photoCopy.comments = commentsGroupedByPhoto[photo.id];
return photoCopy;
});
console.log('photoArray --- ' + JSON.stringify(photoArray));
console.log('photos --- ' + JSON.stringify(photos));
Cela donne quelques informations intéressantes sur le travail avec des tableaux d'objets. Stackoverflow.com/Questtions/12462318/...
@RAZVAN OLARIU Vérifiez ma réponse ci-dessous, j'ai utilisé Array.Reduce et Array.map pour obtenir ce que vous voulez