如何在Javascript中创建另一个数组的重复值数组?

4

我有一个数组,其中包含来自多个公司(一些来自相同的公司,一些不是)的注册人员,并且我需要计算来自同一公司的人数。因此,我需要一个数字告诉我有多少来自不同公司的额外人员已经注册(除去第一个人)。

比如我现在有以下这个数组:

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

以及一个变量:

var companies_eligible_for_discount = 0;

我该如何计算需要分配的3个折扣?(其中2个是给“acme”,1个是给“comanche”)

我已经尝试了几乎所有的方法,甚至感觉需要重新开始。 - Jiminy Cricket
如果我的回答不是很清楚,请让我知道。我知道我加了一些详细内容,希望能够为您保持充实。RightSaidFred 给出了更紧凑的版本,这取决于您想要从哪里开始和结束。 - jcolebrand
2个回答

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

当然,对于较低版本的浏览器,可以在 MDN 上找到forEach的支持。 - RightSaidFred
这在IE上不起作用?那对我没什么帮助。很不幸,我的大多数用户都在使用IE。 - Jiminy Cricket
你只需要为那些浏览器(从我提供的链接)添加forEach支持。如果这太麻烦了,就使用标准的for循环。我会进行更新。 - RightSaidFred
太棒了,我想我懂了!你帮了我这么多!我欠你一个人情 ;) - Jiminy Cricket

0
我已经提供了一小段代码,你可以在控制台中运行来测试功能,并创建了一个演示函数,你可以立即使用(删除console.log语句)。它返回一个公司名称的数组。
实际上,我使用的是Javascript具有本地关联对象数组的事实,因此我将toLowerCase字段名(在您的情况下为公司)分配为关联数组查找点的字段。如果字段名尚未是属性,则这是我们第一次添加它。在第一次添加一个(考虑“bobo”)时,我们将其设置为零。在后续时间中,我们将其递增1。
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 );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接