2017-09-15 4 views
-3
var array1 = [ 
    { 
    "_id" : ObjectId("5972dbe185c5a00906fbefa7"), 
    "name" : "user1", 
    "score" : 2.0 
    }, 
    { 
    "_id" : ObjectId("59994cf90b79bc4e8233ed1d"), 
    "name" : "user2", 
    "score" : 1.5 
    }, 
    { 
    "_id" : ObjectId("59880bbaa329573db1180acd"), 
    "name" : "user3", 
    "score" : 0.5 
    }, 
    { 
    "_id" : ObjectId("5972fa945ad42b149da788b2"), 
    "name" : "user4", 
    "score" : 3.0 
    } 
] 

var array2 = [ 
    { 
    "_id" : ObjectId("5972dbe185c5a00906fbefa7"), 
    "name" : "user1", 
    "score" : 1.5 
    }, 
    { 
    "_id" : ObjectId("599d2d8fe9feeb290c699535"), 
    "name" : "user5", 
    "score" : 1.5 
    }, 
    { 
    "_id" : ObjectId("59880bbaa329573db1180acd"), 
    "name" : "user3", 
    "score" : 3.0 
    }, 
    { 
    "_id" : ObjectId("8072fa945ad42b149da799cc"), 
    "name" : "user8", 
    "score" : 2.5 
    } 
] 

array3 = _.unionWith(array1, array2, _.isEqual); 

J'ai deux tableaux d'objets utilisateur renvoyés de deux requêtes de recherche différentes, maintenant il peut y avoir des objets possibles de l'utilisateur en double, je ne supprimé les doublons à l'aide des années lodash Fonction ._unionWith, mais je n'ai pas pu sélectionner et renvoyer l'un des objets dupliqués en ajoutant un autre objet dupliqué à la propriété score de l'objet à renvoyer. Comment puis-je faire cela de manière plus efficace. grâceRechercher les doublons dans les tableaux d'objets et de choisir l'un d'eux comparant leurs valeurs

+1

L'affichage de votre code serait une bonne première étape. – TheCog

+0

Bienvenue sur SO. S'il vous plaît visitez le [aide] pour voir quoi et comment demander. ASTUCE: Post effort et code – mplungjan

+0

oh désolé! Comme c'est ma première question, j'ai pensé que la description de mes questions était suffisante pour être comprise. –

Répondre

0

Vous pouvez prendre une table de hachage comme référence aux objets et réduire le tableau.

var array1 = [{ _id: "5972dbe185c5a00906fbefa7", name: "user1", score: 2.0 }, { _id: "59994cf90b79bc4e8233ed1d", name: "user2", score: 1.5 }, { _id: "59880bbaa329573db1180acd", name: "user3", score: 0.5 }, { _id: "5972fa945ad42b149da788b2", name: "user4", score: 3.0 }], 
 
    array2 = [{ _id: "5972dbe185c5a00906fbefa7", name: "user1", score: 1.5 }, { _id: "599d2d8fe9feeb290c699535", name: "user5", score: 1.5 }, { _id: "59880bbaa329573db1180acd", name: "user3", score: 3.0 }, { _id: "8072fa945ad42b149da799cc", name: "user8", score: 2.5 }], 
 
    hash = Object.create(null), 
 
    result = [array1, array2].reduce(function (r, a) { 
 
     a.forEach(function (o) { 
 
      if (!hash[o._id]) { 
 
       hash[o._id] = o; 
 
       r.push(hash[o._id]); 
 
       return; 
 
      } 
 
      hash[o._id].score += o.score; 
 
     }); 
 
     return r; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

en utilisant des boucles que vous pouvez faire quelque chose comme ceci:

var array1 = [ 
 
    { 
 
    "_id" : "5972dbe185c5a00906fbefa7", 
 
    "name" : "user1", 
 
    "score" : 2.0 
 
    }, 
 
    { 
 
    "_id" : "59994cf90b79bc4e8233ed1d", 
 
    "name" : "user2", 
 
    "score" : 1.5 
 
    }, 
 
    { 
 
    "_id" : "59880bbaa329573db1180acd", 
 
    "name" : "user3", 
 
    "score" : 0.5 
 
    }, 
 
    { 
 
    "_id" : "5972fa945ad42b149da788b2", 
 
    "name" : "user4", 
 
    "score" : 3.0 
 
    } 
 
] 
 

 
var array2 = [ 
 
    { 
 
    "_id" : "5972dbe185c5a00906fbefa7", 
 
    "name" : "user1", 
 
    "score" : 1.5 
 
    }, 
 
    { 
 
    "_id" : "599d2d8fe9feeb290c699535", 
 
    "name" : "user5", 
 
    "score" : 1.5 
 
    }, 
 
    { 
 
    "_id" : "59880bbaa329573db1180acd", 
 
    "name" : "user3", 
 
    "score" : 3.0 
 
    }, 
 
    { 
 
    "_id" : "8072fa945ad42b149da799cc", 
 
    "name" : "user8", 
 
    "score" : 2.5 
 
    } 
 
] 
 

 

 

 
array1.forEach((item)=>{ 
 
    array2.forEach((item2) => { 
 
    if(item._id === item2._id){ 
 
     item2.score = item2.score +item.score;//add score from first array dup to second 
 
    } 
 
    
 
    }); 
 
    }); 
 
console.log(array2)

array2 a maintenant le score pour tous les doublons dans array1

Note: Je retirai ObjectId pour l'obtenir à travailler dans un extrait