2015-12-21 10 views
5

Muszę utworzyć funkcję sortowania ciągu liczb na podstawie "wagi" każdej liczby - "waga" to cyfry sumowanych razem (waga 99 wynosi 18, waga 100 wynosiłaby 1 itd. itd.). Oznacza to, że ciąg "100 54 32 62" zwróci "100 32 62 54".Jak sortować jedną tablicę na podstawie sposobu sortowania innego? (Javascript)

mogę dostać tablicę ciężarów tych liczb tylko przy użyciu drobnych:

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

gdzie add jest tylko ogólna funkcja dodatkiem. W powyższym przykładzie sortArr będzie [1, 9, 5, 8].

Jaki jest najlepszy sposób na posortowanie tablicy oryginalnych liczb z ciągu arr w oparciu o sposób sortowania nowych tablic liczb o numerach sortArr?

Dzięki!

Odpowiedz

4

To powinno załatwić sprawę:

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); 

wyjściowa:

100 32 62 54 

UPDATE:

Per sugerowane przez Sterling, oto ta sama funkcja napisana w formacie 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); 

Uwaga: Piszę po raz pierwszy w JavaScript przy użyciu składni lambda. Dzięki Sterling za sugestię.

+0

zadziałał jak czar! Dziękuję. praktyka z rekurencją – joh04667

+0

Powinieneś edytować to, aby pokazać składnię ES6, jak OP używa –

+0

@Sterling - Nie jestem pewien, co masz na myśli, proszę opracuj, abym mógł zaktualizować odpowiedź ... dzięki – Will

0

Rozwiązanie z 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

bym tablicę wskaźników (0..N-1) i układać na podstawie tablicy obciążenia (poprzez przepuszczenie funkcję porównania, który porównuje wagi dla danego wskaźnika wartości). Następnie będziesz mieć tablicę indeksów, które pokazują, gdzie powinien być każdy element (w twoim przykładzie tablica indeksowa będzie miała [0, 2, 3, 1], co oznacza, że ​​arr [0] powinien być pierwszy, a następnie arr [2 ], itd. Teraz możesz zbudować posortowaną tablicę za pomocą tablicy indeksowej, na przykład [arr [0], arr [2], arr [3], arr [1]]. Tak, aby podsumować: Pobierz tablicę wejściową , oblicz tablicę wag, utwórz tablicę indeksów 0..n-1, posortuj ją w oparciu o tablicę wag, a na koniec skonstruuj tablicę wyników na podstawie posortowanej tablicy indeksów.

Powiązane problemy