2013-04-06 49 views
0

我有一个项目的数组。例如: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"] 
+0

是否所有项目都是字符串? – kennytm 2013-04-06 10:33:49

+1

哪部分你有问题?请发布迄今为止的代码。这里例如是一个关于如何计算数组的独特元素的相关问题:http://stackoverflow.com/q/5667888/218196。 – 2013-04-06 10:35:47

回答

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

+0

如何将数组转换为频率对象,这真是太神奇了。谢谢! – 2013-04-06 13:45:10

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

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