2015-12-21 10 views
5

Devo creare una funzione per ordinare una stringa di numeri basata sul 'peso' di ogni numero - il 'peso' è le cifre dei numeri sommati insieme (il peso di 99 sarebbe 18, il il peso di 100 sarebbe 1, ecc. ecc.). Ciò significa che una stringa "100 54 32 62" restituirà "100 32 62 54".Come ordinare un array in base a come viene ordinato un altro? (Javascript)

posso ottenere una matrice dei pesi di questi numeri che bene utilizzando:

function orderWeight(str) { 
    var arr = str.split(" "); 
    var sortArr = []; 
    arr.forEach(t => sortArr.push(t.split("").map(s => parseInt(s, 10)).reduce(add, 0))); 
} 

dove add è solo una funzione aggiunta generica. Per l'esempio sopra, sortArr sarebbe [1, 9, 5, 8].

Qual è il modo migliore per ordinare la matrice dei numeri originali dalla stringa arr in base alla modalità di ordinamento della nuova matrice del numero ponderale sortArr?

Grazie!

risposta

4

Questo dovrebbe fare il trucco:

var x = '100 54 32 62'; 

function orderWeight(str) { 
    return str.split(' ').sort(function(a, b) { 
    return (a.split('').reduce(function(p, c) { return +p + +c; })) > (b.split('').reduce(function(p, c) { return +p + +c; })); 
    }).join(' '); 
} 

var result = orderWeight(x); 

uscita:

100 32 62 54 

UPDATE:

Per suggerito da Sterling, ecco la stessa funzione scritta in formato lambda.

var x = '100 54 32 62'; 

function orderWeight(str) { 
    return str.split(' ').sort((a, b) => a.split('').reduce((p, c) => +p + +c) > b.split('').reduce((p, c) => +p + +c)).join(' '); 
} 

var result = orderWeight(x); 

Nota: è la prima volta che si scrive Javascript utilizzando la sintassi lambda. Grazie a Sterling per aver suggerito.

+0

ha funzionato come un incantesimo! Grazie. – joh04667

+0

Si dovrebbe modificare questo per mostrare la sintassi ES6 come OP sta usando –

+0

@Sterling - Non sono sicuro di cosa intendi, per favore elabora in modo da poter aggiornare la risposta ... grazie – Will

0

Una soluzione con sorting with map.

function sort(string) { 
 
    var array = string.split(' '), 
 
     mapped = array.map(function (a, i) { 
 
      return { index: i, value: +a.split('').reduce(function (a, b) { return +a + +b; }) }; 
 
     }); 
 
    return mapped.sort(function (a, b) { 
 
     return a.value - b.value; 
 
    }).map(function (a) { 
 
     return array[a.index]; 
 
    }).join(' '); 
 
} 
 

 
document.write('<pre>' + JSON.stringify(sort('100 54 32 62'), 0, 4) + '</pre>');

-1

avrei un array di indici (0..n-1) e di risolvere basata sulla matrice pesi (passando una funzione di confronto che confronta i pesi per il dato indice valori). Quindi avrai una matrice di indici, che mostra dove dovrebbe essere ciascun elemento (nel tuo esempio l'array di indici sarebbe [0, 2, 3, 1] che significa che arr [0] dovrebbe essere il primo, quindi arr [2 ], ecc. Così ora puoi costruire l'array ordinato usando l'array di indici, ad esempio [arr [0], arr [2], arr [3], arr [1]]. Quindi ricapitolare: Ottieni l'array di input , calcola l'array di pesi, crea l'array di indici 0..n-1, lo ordina in base all'array di pesi e infine costruisce l'array di output in base all'array di indice ordinato