2013-02-24 38 views
13

JavaScript'te, dizideki öğe sayısı aşağıdaki gibi olacaktır. dizininSıralamaksızın dizideki benzersiz öğeleri sayın

arr = ["jam", "beef", "cream", "jam"] 
arr.sort(); 
var count = 1; 
var results = ""; 
for (var i = 0; i < arr.length; i++) 
{ 
    if (arr[i] == arr[i+1]) 
    { 
     count +=1; 
    } 
    else 
    { 
     results += arr[i] + " --> " + count + " times\n" ; 
     count=1; 
    } 
} 

bir elemanın en az olacaksa varsayarsak o tür() kullanmadan veya herhangi bir şekilde diziyi mutasyona olmadan bunu yapmak mümkün mü? Dizinin yeniden oluşturulmasının gerekeceğini ve yeni oluşturulan dizide sıralama yapılabileceğini düşünürdüm, ama sıralamadan kaçınmanın en iyi yolunun ne olduğunu bilmek istiyorum. Ve evet, ben bir sanatçıyım, programcı değil, onurun.

+0

Sesleri iyi bir çözüm gibi kopyalayıp sıralayarak. Neden bundan kaçınmak istersiniz? – Bergi

+2

Öğeleri bir sözlükte itebilir ve tuş sayısını belirleyebilirsiniz. – zsong

+0

Sadece bu konuda bir yol bilmek istiyorum. Ben sadece merak ediyorum.İkincisi, diğer unsurların dayandığı orijinal diziyi karıştırıyor. Diziyi bir nesneye çevirmekten daha iyi olabilirim. Ama bir nesnenin çeşitli kısımlarına ne tür bir şey olacağını bilmiyorum. –

cevap

30

Bunu yapmanın hızlı bir yolu, benzersiz öğeleri bir Nesne'ye kopyalamaktır. Bu döngü tamamlandığında

var counts = {}; 
for (var i = 0; i < arr.length; i++) { 
    counts[arr[i]] = 1 + (counts[arr[i]] || 0); 
} 

counts nesne dizisi her biri farklı bir elemanın sayımına sahip olacaklardır.

+0

ile aynı değildir. Bu, yalnızca benzersiz öğeler dizgiler (veya benzersiz dizelere dönüştürülürse) – Bergi

+2

@Bergi tarafından verildiğinde çalışır, ancak OP'nin örneğindedir. – kojiro

+0

Eğer "jam", "beef", "cream" ve "jam" kelimelerini kastediyorsanız, bunlar OPs örneğindeki değişkenlerdir. Onların ne içerdiğini bilmiyoruz – Bergi

5

Bu ifade o mutasyona olmadan dizideki tüm benzersiz elemanları verir:

arr.filter(function(v,i) { return i==arr.lastIndexOf(v); }) 

Sen sonuçların sizin dizesini oluşturmak için bu ifade ile o zincir yapabilirsiniz sıralama olmadan:

.forEach(function(v) { 
    results+=v+" --> " + arr.filter(function(w){return w==v;}).length + " times\n"; 
}); 

yılında filtrenin aldığı ilk durum sadece her bir belirli elemanın sonunu içerir; ikinci durumda filtre, bu türdeki tüm elemanları içerir ve .length sayımı verir.

+0

Hem 'filter' hem de '[last] indexOf', JavaScript 1.6 gerektirir. Bu cevap bazı açıklayıcı yorumlar kullanabilir. – kojiro

+1

Filtre geri araması, eleman değil, bir boole döndürmelidir. Ve her bir döngü için OP'lerin orijinal betiği – Bergi

7

Bunu yapmanın en hızlı yolu new Set() object.

Takımlar harika ve daha sık kullanmalıyız. Hızlı, Chrome, Firefox, Microsoft Edge ve node.js. .

: -

bir Set öğelerin sadece sen koymak her değerin bir kopyasını tutar her zaman olduğu gibi, benzersiz olacaktır Andrei Kashcha tarafından What is faster Set or Object? İşte bu özelliği kullanan bir fonksiyon var

function countUnique(iterable) { 
 
    return new Set(iterable).size; 
 
} 
 

 
console.log(countUnique('banana')); //=> 3 
 
console.log(countUnique([5,6,5,6])); //=> 2 
 
console.log(countUnique([window, document, window])); //=> 2

Bu Ar dahil olmak üzere herhangi iterable öğeleri (saymak için kullanılabilir ray, String, TypedArray ve arguments nesnesi).

0

gibi bir şey neden:

var arr = ["jam", "beef", "cream", "jam"] 
 
var uniqs = arr.reduce((acc, val) => { 
 
    acc[val] = acc[val] === undefined ? 1 : acc[val] += 1; 
 
    return acc; 
 
}, {}); 
 
console.log(uniqs)

Saf JavaScript, O (n) çalışır. Benzersiz değerlerinizin sayısının, öğelerin sayısına eşit olmaması durumunda (tüm öğeler benzersizdir) fazla yer tüketmez.

İlgili konular