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

How do I make an array of another array's duplicate values only in Javascript?

本文关键字:数组 Javascript 创建 另一个      更新时间:2023-09-26

我有一个数组,其中包含来自多个公司的注册者(有些来自同一家公司,有些不是),我需要计算来自同一家公司的注册人数。所以我需要一个数字来告诉我有多少额外的人(在第一个之后)来自不同的公司已经注册。

假设我有一个数组:

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

和一个变量:

var companies_eligible_for_discount = 0;

我如何计算分配的3个折扣?("acme"为2,"comanche"为1)

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

我提供了一个代码片段,您可以在控制台中运行它来测试该功能,并创建了一个可以立即使用的演示函数(删除console.log语句)。它返回一个公司名称数组。

实际上,我正在做的是使用Javascript具有对象的本机关联数组这一事实,因此我将toLowerCase字段名(在您的情况下是公司)分配为关联数组查找点的字段。如果字段名还不是属性,那么这是我们第一次添加它。当我们第一次添加1时(考虑"bobo"),我们将其设置为0。

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