2017-09-25 1 views
-1

J'essaie de combiner deux tableaux dans un tableau d'objets et je suis aux prises avec cela.Combiner deux tableaux dans un tableau d'objets, en comptant les doublons

Exemple:

arr1 = [a,b,c]; 
arr2 = [a,a,a,b,b,c,d,d]; 

La façon dont je voudrais avoir ces deux combinés:

combinedArr = [ 
    {name: a, amount: 3}, 
    {name: b, amount: 2}, 
    {name: c, amount: 1} 
]; 

Notez que seules les valeurs stockées dans arr1 doivent être intégrés, toute arr2 valeurs inexistante arr1 sont juste laissés de côté. (dans cet exemple, c'est "d")

Il est également important de savoir que j'utilise ceci pour Extendscript d'After Effect qui me limite à la 3ème édition de la norme ECMA-262, me laissant avec le bon vieux javascript classique . Les fonctionnalités telles que concat, slice et join ne sont pas disponibles.

J'ai essayé de contourner mais je ne peux pas le comprendre .. Je suis sûr qu'il est possible de réaliser une solution avec seulement deux ou trois boucles intelligentes à travers les rangées.

Merci à l'avance, Simon

EDIT: J'ai créé la confusion en ne pas ajouter mes propres tentatives de mon problème. Je suis désolé de ne pas l'avoir fait, j'y ai réfléchi du jour au lendemain et j'ai écrit cette question sur mon téléphone dans le train.

J'ai déjà reçu des réponses incroyables dont je suis très content, juste pour prouver que je n'avais pas de mauvais sens à propos de ma question, je posterai ce que j'avais écrit auparavant (pas simplifié, mais du code réel) :

var createMarkerList = function() { 
    var subList = _createMarkerListSub(); //in this example arr1 
    var masterList = _createMarkerListMaster(); //in this example arr2 
    var output = []; 

    for(var i=0;i<subList.length;i++){ 
     var uniqueMarker = subList[i]; 
     output.push({ 
      name: uniqueMarker, 
      amount: 0, 
     }); 
    } 

    for(var i=0;i<masterList.length;i++){ 
     var genericMarker = masterList[i]; 

     if(output[i].name == genericMarker){ 
      output[i].amount = output[i].amount +1; 
     } 
    } 
} 

S'il vous plaît noter que je did't essayer d'obtenir le chemin facile autour de vous demande la réponse sans essayer de le comprendre, je ne pouvais tout simplement pas obtenir ma tête autour d'elle pour une raison quelconque.

+3

Avez-vous essayé quoi que ce soit? – Rajesh

+0

Je suis d'accord avec Rajesh, et c'est juste quelque chose de si basique, je recommande de lire un tutoriel javascript d'abord – Verthosa

+0

@ Simon, rappelez-vous qu'il est très important de partager votre effort. Ce peut être * code/algorithmes/liens recherchés *. À moins que vous ne le partagiez, votre question ressemblera à une exigence et non à un énoncé de problème. Cela pourrait attirer des votes/commentaires non désirés. – Rajesh

Répondre

2

vous devrez parcourir sur les deux tableaux et garder le compte de tous les éléments dans arr1.

var arr1 = ['a','b','c']; 
 
var arr2 = ['a','a','a','b','b','c','d','d']; 
 
var combinedObject= {}, combinedArray = []; 
 
for(var i=0; i<arr1.length; i++) 
 
    combinedObject[arr1[i]] = 0; 
 

 
for(var i=0; i<arr2.length; i++) 
 
    if(combinedObject.hasOwnProperty(arr2[i])) 
 
combinedObject[arr2[i]]++; 
 

 
for(var key in combinedObject) 
 
    combinedArray.push({'name': key, 'amount':combinedObject[key]}); 
 

 
console.log(combinedArray);

+1

Devrions-nous répondre à de telles questions qui ne montrent aucun signe d'entrée? – Rajesh

+0

@Rajesh son argumentable, mais peut-être OP ne devient pas comment le faire pour que la réponse l'aidera à comprendre. on peut espérer que OP chercherait et essayerait de comprendre la solution plutôt que de simplement la copier.L'autre option serait de simplement ignorer la question, mais cela n'aidera personne de toute façon. – Dij

+1

@Dij Oui c'est discutable, mais OP n'a même pas montré sa tentative. OP a mentionné: «J'ai essayé mais je ne peux pas le comprendre», mais je n'ai pas montré ce qu'il a essayé. – gurvinder372

1

Vous pouvez utiliser une table de hachage et de l'utiliser pour le comptage.

Vous devez boucler arr1 pour créer la table de hachage et le jeu de résultats et une deuxième boucle sur l'élément pour compter et incrémenter la propriété amount.

var arr1 = ['a', 'b', 'c'], 
 
    arr2 = ['a', 'a', 'a', 'b', 'b', 'c', 'd', 'd'], 
 
    hash = {}, 
 
    result = [], 
 
    i; 
 
    
 
for (i = 0; i < arr1.length; i++) { 
 
    hash[arr1[i]] = { name: arr1[i], amount: 0 }; 
 
    result.push(hash[arr1[i]]); 
 
} 
 

 
for (i = 0; i < arr2.length; i++) { 
 
    hash[arr2[i]] && hash[arr2[i]].amount++; 
 
} 
 

 
console.log(result);

+0

Merci beaucoup! Les deux réponses ont fonctionné, mais je n'étais pas au courant des tables de hachage. Je vais lire dedans! –