Javascript排序索引链接数组

时间:2016-05-06 02:22:46

标签: javascript arrays sorting

很抱歉,如果已经提出这个问题,但我确实搜索了“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>";
}

有没有其他人遇到过这个问题,你是怎么解决的。

2 个答案:

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