很抱歉,如果已经提出这个问题,但我确实搜索了“javascript sort index linked array”,并且没有找到任何令人满意的结果。
我有一个名字数组,另一个索引链接数组记录名称出现在一个段落中的频率,我想按字母顺序对两个数组进行排序,但是根据名称频率排序 - 比方说,最常见的至少频繁。我有足够的代码可以完成这项工作,但我认为它看起来像是一个黑客。当然,有一种更加高雅的方式可以解决一个非常常见的排序问题。
我从一系列名字开始[]说,6个约翰,2个安尼斯,9个汤姆斯,12个安德鲁斯,3个克里斯滕斯,1个阿奇和14个彼得斯 - 已按字母顺序排序并计入频率,以下例程导致名称和频率数组的索引数组,允许我按从高到低的顺序显示名称和频率。
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 :(得分: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);
}
答案 1 :(得分: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>'));