2016-05-06 3 views
1

Извините, если это уже было задано, но я искал «связанный массив индекса сортировки javascript» и не нашел ничего удовлетворительного.Связанный массив индекса сортировки Javascript

У меня есть массив имен и другой связанный с индексом массив, который записывает частоту, с которой имена появляются в проходе, и я хочу сортировать оба массива не в алфавитном порядке, а в соответствии с частотами имен - скажем, большинством частыми и наименее частыми. У меня есть следующий бит кода, который выполняет эту работу адекватно, но я думаю, что это выглядит как взлома. Наверняка есть более достойный способ решить, что должно быть довольно распространенной проблемой сортировки.

Я начинаю с массива имен [], например, 6 Johns, 2 Annes, 9 Toms, 12 Andrews, 3 Kristens, 1 Archie и 14 Peters - уже отсортированы по алфавиту и пересчитаны на частоты, а подпрограмма под результатами в массиве индексов к именам и частотным массивам, что позволяет мне отображать имена и частоты в порядке от наивысшего до самого низкого.

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

Теперь я могу перечислить оба массива в соответствии с названиями частот.

var txt = ""; 
var useindex; 
for (i = 0; i < numindex.length; i++) { 
    useindex = numindex[i]; 
    txt = txt + names[useindex] + " - " + frequency[useindex] + "<br>"; 
} 

У кого-нибудь еще была эта проблема и как вы ее разрешили.

+0

Вы можете передать функцию обратного вызова для '.sort()' для руководства, как работает сортировка. – Pointy

+0

Что такое «* связанный с индексом массив»? Звучит как [параллельный массив] (https://en.wikipedia.org/wiki/Parallel_array), но я не уверен. – Bergi

+1

Вы должны использовать объекты («кортежи», если хотите) вместо сериализации ваших данных в строки. – Bergi

ответ

0

попробовать это:

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

В принципе можно использовать индексы и сортировать их, получая частоту для данного индекса.

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

Смежные вопросы