2011-11-26 66 views
4

我有一個來自多家公司(有些來自同一家公司,有些來自不同公司)的註冊人陣列,我需要統計同一家公司有多少人註冊過。所以我需要一個數字,告訴我有多少額外的人(在第一個之後)來自獨特的公司已經註冊。如何在JavaScript中創建另一個數組重複值的數組?

說我有一個數組:

var company_names = ['acme', 'acme', 'bobo', 'comanche', 'acme', 'comanche']; 

和變量:

var companies_eligible_for_discount = 0; 

我會怎麼算的是3個折扣都將被分配? (2「極致」,1個用於「科曼奇」)

+0

我一直在嘗試一切。非常到了我想從廣場1開始的地步。 –

+0

讓我知道我的答案是不是很容易理解。我知道我爲它添加了一點肉,希望能爲它保留它。 RightSaidFred給出了更緊湊的版本,它只取決於你想要開始和結束的東西。 – jcolebrand

回答

5
var dupes = {}; 

company_names.forEach(function(v,i) { 
    if(v in dupes) { 
     dupes[v]++; 
     companies_eligible_for_discount++; 
    } 
    else dupes[v] = 0; 
}); 

var dupes = {}, v, i; 

for(i = 0; i < company_names.length; ++i) { 
    v = company_names[i]; 
    if(v in dupes) { 
     dupes[v]++; 
     companies_eligible_for_discount++; 
    } 
    else dupes[v] = 0; 
} 
+0

...當然,可以在[MDN](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach)上找到對下級瀏覽器的forEach支持。 – RightSaidFred

+0

所以這不適用於IE?這不會幫助我。不幸的是,我的大多數用戶都在IE中。 –

+0

您只需要爲這些瀏覽器添加'forEach'支持(從我提供的鏈接)。如果這太麻煩了,請使用標準的'for'循環。我會更新。 – RightSaidFred

0

我提供,你可以在控制檯上運行測試功能的片段,並創建了一個演示功能你可以立即使用(移除console.log語句)。它返回一組公司名稱。

我正在做的事情是使用Javascript具有對象的本機關聯數組這一事實,因此我將toLowerCase字段名(在您的情況下是公司)指定爲關聯數組查找點的字段。如果字段名稱不是屬性,那麼這是我們第一次添加它。我們第一次添加一個(考慮「bobo」),我們將其設置爲零。在隨後的時間裏,我們增加一個。

function getCompaniesOver(companyArray, discountMinimum){ 
    var tallyObject = {}, 
     retArray = [], 
     has = Object.prototype.hasOwnProperty; //I'm making sure that we have a clean reference to the hasOwnProperty 
    for(var k in companyArray){ 
    var s = companyArray[k]+''; s = s.toLowerCase(); 
    if (has.call(tallyObject,s)){ 
     tallyObject[s]++; 
    } else { 
     tallyObject[s] = 0; 
    } 
    } 

    console.log(tallyObject); // for debugging insepection. 

    console.log('companies with ' +companies_eligible_for_discount+ ' number of employees above 1 attending') 
    console.log('--------') 
    for (var k in tallyObject){ 
    if (tallyObject[k] >= companies_eligible_for_discount){ 
     console.log(k); 
     retArray.push(k); 
    } 
    } 
    console.log('--------') 

    return retArray; 
} 

var company_names_long = ['acme', 'acme', 'bobo', 'comanche', 'acme', 'comanche', 'comanche', 'acme', 'sanford & sons', 'Sanford & Sons', 'Johnson&Johnson', 'johnson&johnson']; 

var company_names = ['acme', 'acme', 'bobo', 'comanche', 'acme', 'comanche'], 
    companies_eligible_for_discount = 2; //this is the range you can supply 

getCompaniesOver(company_names, companies_eligible_for_discount); 

companies_eligible_for_discount = 1; 
getCompaniesOver(company_names_long, companies_eligible_for_discount); 
相關問題