2011-11-26 59 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); 
相关问题