2013-01-17 2 views
1

Supposons que j'ai ce tableau javascriptjavascript réseau en double dans un autre tableau

ar = ['C241C12A-45FD-40FF-B26E-B879107E584D||20', 
     'AB1BB99D-4396-415A-A5D8-1BEF3E0149CE||33', 
     'ADE54113-53D1-4F26-A01C-48EBE37E3CE8||85', 
     'DB500FD1-5988-4202-A4AA-727AC29AC67A||85', 
     '8A8EAB5A-E0D2-4AA8-96A0-42686FF5EB0C||10', 
     '50C29E8A-16C7-4FC2-A186-C3D65F23C627||200', 
     '70C79BBB-14C7-4F34-346B-CSSSDFVFZZZ7||200' 
    ]; 

est-il possible d'obtenir des tableaux comme cette

newarray1 = [ 
     'ADE54113-53D1-4F26-A01C-48EBE37E3CE8||85', 
     'DB500FD1-5988-4202-A4AA-727AC29AC67A||85' 
     ]; 
newarray2 = [ 
     '50C29E8A-16C7-4FC2-A186-C3D65F23C627||200', 
     '70C79BBB-14C7-4F34-346B-CSSSDFVFZZZ7||200' 
     ]; 

Les valeurs en double qui vient après le symbole de pipe, grab que valeur et former une nouvelle matrice sur la base de ce

+0

Boucle Traverser les entrées et créer vos nouveaux tableaux est une solution. Je ne sais pas s'il peut y avoir un moyen plus efficace de le faire. – ryadavilli

+0

Votre exemple ne semble pas trié, '10' entre '85' et' 200'? – Bergi

+0

@Bergi ..son string c'est pourquoi..retiré cette ligne – coolguy

Répondre

2
var arraysByKey = {}; 
for (var i=0; i<ar.length; i++) { 
    var key = ar[i].split("||")[1]; 
    if (key in arraysByKey) 
     arraysByKey[key].push(ar[i]); 
    else 
     arraysByKey[key] = [ ar[i] ]; 
} 

Le résultat (arraysByKey) ressemblera à ceci alors:

{ 
    "10": [ 
     "8A8EAB5A-E0D2-4AA8-96A0-42686FF5EB0C||10" 
    ], 
    "20": [ 
     "C241C12A-45FD-40FF-B26E-B879107E584D||20" 
    ], 
    "33": [ 
     "AB1BB99D-4396-415A-A5D8-1BEF3E0149CE||33" 
    ], 
    "85": [ 
     "ADE54113-53D1-4F26-A01C-48EBE37E3CE8||85", 
     "DB500FD1-5988-4202-A4AA-727AC29AC67A||85" 
    ], 
    "200": [ 
     "50C29E8A-16C7-4FC2-A186-C3D65F23C627||200", 
     "70C79BBB-14C7-4F34-346B-CSSSDFVFZZZ7||200" 
    ] 
} 

Si vous ne souhaitez que des tableaux où "les valeurs en double" EXISTE, filtre seulement le résultat:

for (var key in arraysByKey) 
    if (arraysByKey[key].length < 2) 
     delete arraysByKey[key]; 
+0

Vous obtiendrez une erreur de cette façon. –

+0

@RicardoLohmann: Correction déjà – Bergi

+0

@Bergi un doute comment vérifier si la copie existe i signifie «si (arraysByKey.length> 0) {' mais il me donne une erreur indéfinie .. bien qu'il ait quelques – coolguy

1
var keyArray = {}; 

for (var counter = 0; counter < ar.length; counter++) 
{ 
    var arValue = ar[ counter ]; 
    var intVal = ar.split("||")[1]; 

    if (keyArray[ intVal ] == null || keyArray[ intVal ] == undefined) 
    { 
    keyArray[ intVal ] = new Array(); 
    } 
    keyArray[ intVal ].push(arValue ); 
} 
filterDuplicates(); 

function filterDuplicates(keyArray) 
{ 
    for (key in keyArray) 
    { 

    keyArray[key] = keyArray[key].filter(function(elem, pos, self) { 
    return self.indexOf(elem) == pos; 
    } 
    } 
return keyArray(); 

) 

}

Maintenant, vous avez un tableau dans chaque valeur d'index de l'objet 'keyArray'

+0

Merci homme + 1ed pour l'effort – coolguy

+0

Vous êtes toujours les bienvenus :) – gurvinder372

1

Cette solution n'est pas la plus élégante, mais elle vous donnera un objet de vos tableaux souhaités.

dupecheck = {}; 
dupes = {}; 
$.each(ar, function() { 
    var num = this.split('||')[1]; 

    if (typeof dupecheck[num] !== 'undefined') { 
     if (typeof dupes[num] === 'undefined') { 
     dupes[num] = []; 
     dupes[num].push(dupecheck[num]); 
     } 
     dupes[num].push(this); 
    } 

    dupecheck[num] = this; 
}); 

http://jsfiddle.net/38wme/

+0

Merci homme + 1ed pour l'effort – coolguy

Questions connexes