2016-05-06 4 views
1

Sorry, wenn dies bereits gefragt wurde, aber ich habe "Javascript Sortierindex verknüpfte Array" Suche und nichts zufriedenstellendes gefunden.Javascript Sortierindex verknüpften Array

Ich habe ein Array von Namen, und ein anderes indexverknüpftes Array, das die Häufigkeit aufzeichnet, mit der die Namen in einer Passage erscheinen, und ich möchte beide Arrays nicht alphabetisch sondern nach dem Namen Frequenzen sortieren - sagen die meisten häufig bis am wenigsten häufig. Ich habe den folgenden Code, der die Aufgabe adäquat erledigt, aber ich denke, dass es wie ein Hack aussieht. Sicherlich gibt es einen eleganteren Weg zu lösen, was ein ziemlich häufiges Sortierproblem sein muss.

Ich beginne mit einer Reihe von Namen [] sagen, 6 Johns, 2 Annes, 9 Toms, 12 Andrews, 3 Kristens, 1 Archie und 14 Peters - bereits alphabetisch sortiert und in Frequenzen gezählt, und die untenstehende Routine ergibt in einem Array von Indizes zu den Namen und Frequenz-Arrays, die es mir erlaubt, die Namen und Frequenzen in der Reihenfolge von der höchsten zur niedrigsten anzuzeigen.

var names = ["Andrew", "Anne", "Archie", "John", "Kristen", "Peter", "Tom"]; 
var frequency = [12, 2, 1, 6, 3, 14, 9]; 
var holder = [], secondpart = [], numindex = []; 
var i; 
for (i = 0; i < frequency.length; i++) { 
    if (frequency[i] < 10) { 
     holder[i] = "0" + frequency[i] + "!" + i; // add leading zeros as required 
    } 
    if (frequency[i] > 9) { 
     holder[i] = frequency[i] + "!" + i; // no leading zeros required 
    } 
} 
holder.sort(); 
holder.reverse(); 
for (i = 0; i < holder.length; i++) { 
    secondpart[i] = holder[i].substring(holder[i].indexOf("!") + 1, holder[i].length); 
    numindex[i] = parseInt(secondpart[i]); 
} 

Ich kann jetzt beide Arrays nach dem Namen Frequenzen auflisten.

Hat jemand anderes dieses Problem und wie haben Sie es gelöst?

+0

Sie können einen Rückruf an '.Sort()' führen passieren, wie die Art funktioniert. – Pointy

+0

Was ist ein "* index linked array *"? Klingt wie ein [paralleles Array] (https://en.wikipedia.org/wiki/Parallel_array), aber ich bin mir nicht sicher. – Bergi

+1

Sie sollten Objekte ("Tupel", wenn Sie möchten) verwenden, anstatt Ihre Daten in Strings zu serialisieren. – Bergi

Antwort

0

versuchen Sie dies:

var names = ["Adam", "Peter", "Mahu", "Lala"]; 
var frequencies = [6,2,9,1]; 

var tupples=[]; 
for(let i = 0; i<names.length; i++) 
{ 
    tupples[i] = { 
     frequency : frequencies[i], 
     name : names[i] 
    }; 
} 

//ascending 
//tupples.sort(function(a,b){return a.frequency-b.frequency;}); 

//descending 
tupples.sort(function(a,b){return b.frequency-a.frequency;}); 

for(let i=0; i<tupples.length; i++) 
{ 
    console.debug(tupples[i].name, tupples[i].frequency); 
} 
0

Grundsätzlich könnte man die Indizes verwenden und sie sortieren, indem die die Frequenz für den angegebenen Index zu bekommen.

var names = ['Andrew', 'Anne', 'Archie', 'John', 'Kristen', 'Peter', 'Tom'], 
 
    frequency = [12, 2, 1, 6, 3, 14, 9], 
 
    indices = names.map(function(_, i) { return i; }); 
 

 
indices.sort(function(a, b) { 
 
    return frequency[b] - frequency[a]; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(indices, 0, 4) + '</pre>'); 
 
document.write(indices.map(function(a) { return names[a]; }).join('<br>'));