2016-02-17 13 views
5

ho due array js, uno contiene le stringhe, gli altri codici di colore, qualcosa di simile:Ordinare i due array di valori differenti mantenendo abbinamento originale

strings = ['one', 'twooo', 'tres', 'four']; 
colors = ['000000', 'ffffff', 'cccccc', '333333']; 

ho bisogno di ordinare il primo array per la lunghezza dei valori prima più a lungo. So che posso fare qualcosa di simile:

strings.sort(function(a, b){ 
    return b.length - a.length; 
}); 

Ma in questo modo sto perdendo il colore assegnato a ogni stringa. Come posso ordinare entrambi gli array mantenendo l'abbinamento delle chiavi?

+3

Perché non solo un singolo array di oggetti – Tushar

+2

a volte si può non solo ricodificare centinaia di righe di codice. – Mark

+1

C'è sempre il trucco di creare un terzo array da 1 alla lunghezza degli altri due array e di ordinarlo. Quindi è possibile riorganizzare gli altri due array. Oppure puoi scrivere il tuo codice di ordinamento e fare due swap invece di uno. –

risposta

5

Copiata in modo evidente da Sorting with map e adattata.

Utilizza solo lo stesso tipo di ordinamento per l'altro array.

// the array to be sorted 
 
var strings = ['one', 'twooo', 'tres', 'four'], 
 
    colors = ['000000', 'ffffff', 'cccccc', '333333']; 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = strings.map(function (el, i) { 
 
    return { index: i, value: el.length }; 
 
}) 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function (a, b) { 
 
    return b.value - a.value; 
 
}); 
 

 
// container for the resulting order 
 
var resultStrings = mapped.map(function (el) { 
 
    return strings[el.index]; 
 
}); 
 
var resultColors = mapped.map(function (el) { 
 
    return colors[el.index]; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(resultStrings, 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(resultColors, 0, 4) + '</pre>');

+1

La chiamata 'toLowerCase' è ridondante poiché le stringhe non vengono effettivamente confrontate durante' sort' – hindmost

+0

ho cambiato il valore –

+1

solo la mappa di emissione non è supportata con ie-8. – zakaiter

0

Si può provare qualcosa di simile:

var strings = [{name:'one',color:'000000'}, {name:'tres', color:'cccccc'}, {name:'four',color:'333333'}, {name: 'twooo', color:'ffffff'}]; 
 

 
var sorted= strings.sort(function(a,b){ 
 
    return a.name.length > b.name.length; //sort length of name by ascending order 
 
}); 
 

 
console.log(sorted) 
 
document.write('<pre>' + JSON.stringify(sorted, 0, 4) + '</pre>');

0

È possibile utilizzare questo codice:

strings = ['one', 'twooo', 'tres', 'four']; 
colors = ['000000', 'ffffff', 'cccccc', '333333']; 

var a = [];//temporary array, will store objects representing each key of both arrays 
strings.forEach(function(k){ 
    a.push({s:k,c:colors[strings.indexOf(k)]}); 
}); 

a.sort(function(a, b){ 
    return b.s.length - a.s.length; 
}); 

strings = []; 
colors = []; 

a.forEach(function(v){ 
    strings.push(v.s); 
    colors.push(v.c); 
}); 

console.log(strings); 
console.log(colors); 
.210

uscita:

["twooo", "tres", "four", "one"] 
["ffffff", "cccccc", "333333", "000000"] 
+0

Mi piace questo codice ma un problema che ho trovato è che i valori ripetuti in arr1 saranno assegnati allo stesso colore anche quando erano diversi negli array originali. – Mark