2010-02-09 5 views
0

, пожалуйста, скажите мне любой хороший алгоритм/код, чтобы получить список уникальных значений из массива и счет его появления в массиве. (Я использую javascript).Как подсчитать Соответствующие значения в массиве Javascript

+1

Возможный дубликат [Подсчет появления элементов массива JavaScript] (https: // stackove rflow.com/questions/5667888/counting-the-occurrences-of-javascript-array-elements) –

ответ

1

Для метода, который удаляет дубликаты из массива и возвращает новый массив с уникальными значениями, вы можете проверить следующие Array.unique implementation. С сложностью O (n) это, конечно, не самый быстрый алгоритм, но будет выполнять работу для небольших несортированных массивов.

Она распространяется под лицензией GPLv3, так что я должен иметь возможность вставить реализацию здесь:

// ************************************************************************** 
// Copyright 2007 - 2009 Tavs Dokkedahl 
// Contact: http://www.jslab.dk/contact.php 
// 
// This file is part of the JSLab Standard Library (JSL) Program. 
// 
// JSL is free software; you can redistribute it and/or modify 
// it under the terms of the GNU General Public License as published by 
// the Free Software Foundation; either version 3 of the License, or 
// any later version. 
// 
// JSL is distributed in the hope that it will be useful, 
// but WITHOUT ANY WARRANTY; without even the implied warranty of 
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
// GNU General Public License for more details. 
// 
// You should have received a copy of the GNU General Public License 
// along with this program. If not, see <http://www.gnu.org/licenses/>. 
// *************************************************************************** 

Array.prototype.unique = 
    function() { 
    var a = []; 
    var l = this.length; 
    for(var i=0; i<l; i++) { 
     for(var j=i+1; j<l; j++) { 
     if (this[i] === this[j]) // If this[i] is found later in the array 
      j = ++i; 
     } 
     a.push(this[i]); 
    } 
    return a; 
    }; 

Вы бы иметь возможность использовать его следующим образом:

var myArray = new Array("b", "c", "b", "a", "b", "g", "a", "b"); 
myArray.unique(); // returns: ["c", "g", "a", "b"] 

Вы можете настроить выше, чтобы как-то добавить количество вхождений каждого значения.

+2

O (n * n). Не впечатлен. – outis

+0

скажите, пожалуйста, я использую его правильно: arrtmp.unique = function() { var a = []; var l = это.длина; для (var i = 0; i

+0

его не возвращает мне уникальный массив –

2

Используйте объект как ассоциативный массив:

var histo = {}, val; 
for (var i=0; i < arr.length; ++i) { 
    val = arr[i]; 
    if (histo[val]) { 
     ++histo[val]; 
    } else { 
     histo[val] = 1; 
    } 
} 

Это должно быть в худшем случае O (N * Log (N)), в зависимости от времени для доступа к свойствам объекта. Если вы хотите только строки, цикл по свойствам объекта:

for (val in histo) {...} 
+0

Мне нравится это решение. Мне особенно нравится, что вы упомянули о большой скорости O. – Jondlm

1

простой способ заключается в цикле по массиву раз и подсчет значений в хэш

a = [11, 22, 33, 22, 11]; 
count = {} 
for(var i = 0; i < a.length; i++) 
    count[a[i]] = (count[a[i]] || 0) + 1 

«счетчик» будет как это {11: 2, 22: 2, 33: 1}

для отсортированного массива следующий будет быстрее

a = [11, 11, 11, 22, 33, 33, 33, 44]; 
a.sort() 
uniq = []; 
len = a.length 
for(var i = 0; i < len;) { 
    for(var k = i; k < len && a[k] == a[i]; k++); 
    if(k == i + 1) uniq.push(a[i]) 
    i = k 
} 
// here uniq contains elements that occur only once in a 
+0

его не работает приятель –

+0

Я могу подтвердить, что это работает, как говорит стереофрог, вы ДОЛЖНЫ делать что-то неправильно. +1 стереофрог! – PaulM

1

Этот метод работает для массивов примитивов - строки, числа, булевы,

и объекты, которые можно сравнить (как элементы DOM)

Array.prototype.frequency= function(){ 
    var i= 0, ax, count, item, a1= this.slice(0); 
    while(i<a1.length){ 
     count= 1; 
     item= a1[i]; 
     ax= i+1; 
     while(ax<a1.length && (ax= a1.indexOf(item, ax))!= -1){ 
      count+= 1; 
      a1.splice(ax, 1); 
     } 
     a1[i]+= ':'+count; 
     ++i; 
    } 
    return a1; 
} 

var arr= 'jgeeitpbedoowknnlfiaetgetatetiiayolnoaaxtek'.split(''); 
var arrfreq= arr.frequency(); 

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

Вы можете отсортировать его, как вы как- это виды с самого высокого до самой низкой частоты:

arrfreq.sort(function(a, b){ 
    a= a.split(':'); 
    b= b.split(':'); 
    if(a[1]== b[1]){ 
     if(a[0]== b[0]) return 0; 
     return a[0]> b[0]? 1: -1; 
    } 
    return a[1]> b[1]? -1: 1; 
}); 

arrfreq теперь возвращает (Array): [ 'е: 7', 'т: 6', 'а : 5' , 'я: 4', 'о: 4', 'н: 3', 'г: 2', 'к: 2', 'л: 2', 'б: 1', 'd: 1 ',' f: 1 ',' j: 1 ',' p: 1 ',' w: 1 ',' x: 1 ',' y: 1 ']

не должен опускаться IE:

Array.prototype.indexOf= Array.prototype.indexOf || 
function(what, index){ 
    index= index || 0; 
    var L= this.length; 
    while(index< L){ 
     if(this[index]=== what) return index; 
     ++index; 
    } 
    return -1; 
} 
Смежные вопросы