JavaScript按唯一性排序数组

时间:2013-04-06 10:31:38

标签: javascript

我有一系列物品。例如:

var classes = ['link', 'block', 'hide', 'link', 'menu', 'block', 'content', 'link', 'footer', 'img', 'img', 'link', 'modal', 'button', 'form', 'input', 'button', 'input', 'link', 'toString', 'valueOf', 'button'];

我需要获得一系列独特的项目,按频率排序:

'link'项应该在第一位,因为数组包含它5次。

'button'项应位于第二位,因为数组包含它3次。

["link", "button", "input", "img", "block", "footer", "content", "modal", "menu", "form", "hide", "toString", "valueOf"]

6 个答案:

答案 0 :(得分:2)

您可以使用ECMAScript 5方法轻松获取它:

var classes = ['link', 'block', 'hide', 'link', 'menu', 'block', 'content', 'link', 'footer', 'img', 'img', 'link', 'modal', 'button', 'form', 'input', 'button', 'input', 'link', 'toString', 'valueOf', 'button'];

var frequency = classes.reduce(function(data, item) {
    data[item] = -~data[item];
    return data;
}, {});

var uniques = Object.keys(frequency).sort(function(a, b) {
    return frequency[b] - frequency[a];
});

console.log(uniques);

如果您必须支持旧浏览器,您仍然可以使用shims

答案 1 :(得分:1)

两个步骤:

  1. 将您的数据排列在{'item', 'frequency'}
  2. 的数组中
  3. 使用array.sort函数:

    var arr = [{'item':'link', 'freq':4},{'item':'button', 'freq':2},{'item':'div', 'freq':5}];
    
    arr.sort(function(a,b){return b.freq - a.freq});
    

答案 2 :(得分:1)

Underscore.js解决方案:

var dict = _.reduce(classes, function(memo, class) {
    memo[class] = memo[class] ? memo[class] + 1 : 1
}, {});

var pairs = _.pairs(dict);

var sortedPairs = _.sort(pairs, function(pair) {
    return pair[1];
});

var result = _.map(sortedPairs, function(pair) {
    return pair[0];
});

答案 3 :(得分:1)

它应该是这样的。

        var classes = [ 'link', 'block', 'hide',
                    'link', 'menu', 'block',
                    'content', 'link', 'footer',
                    'img', 'img', 'link', 'modal',
                    'button', 'form', 'input',
                    'button', 'input', 'link',
                    'toString', 'valueOf', 'button'];
    var counter;
    var i=0,z=0,x=0;
    var bool = false;
    while(!bool){
        for(j=1;j<classes.length;j++)
        {
            if(( classes[i] == -1) || (classes[j] == -1))
            {
                i++;j++;
            }
            else if(classes[i] === classes[j])
            {
                classes[j] = -1;
                counter = z + "," + (Number(x)+1);
            }
            x++;
        }
        i++;
        z++;
        if((classes.length-1) == i)
        {
            bool = true;
        }
    }
  

在结束计数计数器中的第二个变量(z,“x”)所以每次
  实例Z的出现将是x

答案 4 :(得分:1)

尝试this

var xArray= ["apple","cake","pie","pie","pie","apple"];
var xNew=[];
var temp;

for(var i=0;i<=xArray.length-1;i++)
{
   if( xNew.indexOf(xArray[i]) === -1 )
   {
   xNew.push(xArray[i])    
   }
}

function occuranceOf(xStr)
{
    var xCount =0;
    for(var i=0; i<=xArray.length-1; i++)
    {
        if(xArray[i] === xStr)
            {
        xCount += 1;        
            }                 
    }

    return xCount;
}

for(var i=0;i<=xNew.length-1;i++)
{
    for(var j=i+1; j<=xNew.length-1; j++)
    {
        if(occuranceOf(xNew[i]) < occuranceOf(xNew[j]))
        {
            temp = xNew[i];
            xNew[i] = xNew[j];
            xNew[j] = temp;
        }
    }
}

alert(xNew);

答案 5 :(得分:1)

怎么样:

var classes = ['link', 'block', 'hide', 'link', 'menu', 'block', 'content', 'link', 'footer', 'img', 'img', 'link', 'modal', 'button', 'form', 'input', 'button', 'input', 'link', 'toString', 'valueOf', 'button'],
    frequency = {},
    sortedClasses = [],
    result = [];

for (var i in classes) {
    var name = 'z' + classes[i];
    frequency[name] = frequency[name] ? frequency[name] + 1 : 1;
}

for (var j in frequency) {
    sortedClasses.push([j, frequency[j]]); 
}

sortedClasses.sort(function (a, b) {
    return b[1] - a[1]; 
});

for (var g in sortedClasses) {
    var name = sortedClasses[g][0].substr(1);
    result.push(name);
}

我以“z”为前缀,因为它们的名字如: “的valueOf”