当前位置: 首页 > 面试题库 >

惯用地找到给定值在数组中出现的次数

孙俊彦
2023-03-14
问题内容

我有一个重复值的数组。我想找到任何给定值的出现次数。

例如,如果我有一个这样定义的数组:var dataset = [2,2,4,2,6,4,7,8];,我想查找数组中某个值出现的次数。也就是说,程序应该显示如果我出现3次value 2,发生1次value
6,依此类推。

什么是最惯用/优雅的方法?


问题答案:

reducefilter它不仅仅建立用于计数的临时数组,在这里更合适。

var dataset = [2,2,4,2,6,4,7,8];

var search = 2;



var count = dataset.reduce(function(n, val) {

    return n + (val === search);

}, 0);



console.log(count);

在ES6中:

let count = dataset.reduce((n, x) => n + (x === search), 0);

请注意,使用自定义匹配谓词进行扩展很容易,例如,对具有特定属性的对象进行计数:

people = [

    {name: 'Mary', gender: 'girl'},

    {name: 'Paul', gender: 'boy'},

    {name: 'John', gender: 'boy'},

    {name: 'Lisa', gender: 'girl'},

    {name: 'Bill', gender: 'boy'},

    {name: 'Maklatura', gender: 'girl'}

]



var numBoys = people.reduce(function (n, person) {

    return n + (person.gender == 'boy');

}, 0);



console.log(numBoys);

{x:count of xs}javascript中,对所有项目进行计数(即使对象类似)很复杂,因为对象键只能是字符串,因此无法可靠地对具有混合类型的数组进行计数。不过,以下简单的解决方案在大多数情况下仍然可以正常使用:

count = function (ary, classifier) {

    classifier = classifier || String;

    return ary.reduce(function (counter, item) {

        var p = classifier(item);

        counter[p] = counter.hasOwnProperty(p) ? counter[p] + 1 : 1;

        return counter;

    }, {})

};



people = [

    {name: 'Mary', gender: 'girl'},

    {name: 'Paul', gender: 'boy'},

    {name: 'John', gender: 'boy'},

    {name: 'Lisa', gender: 'girl'},

    {name: 'Bill', gender: 'boy'},

    {name: 'Maklatura', gender: 'girl'}

];



// If you don't provide a `classifier` this simply counts different elements:



cc = count([1, 2, 2, 2, 3, 1]);

console.log(cc);



// With a `classifier` you can group elements by specific property:



countByGender = count(people, function (item) {

    return item.gender

});

console.log(countByGender);

2017更新

在ES6中,您可以使用Map对象可靠地计算任意类型的对象。

class Counter extends Map {

    constructor(iter, key=null) {

        super();

        this.key = key || (x => x);

        for (let x of iter) {

            this.add(x);

        }

    }

    add(x) {

      x = this.key(x);

      this.set(x, (this.get(x) || 0) + 1);

    }

}



// again, with no classifier just count distinct elements



results = new Counter([1, 2, 3, 1, 2, 3, 1, 2, 2]);

for (let [number, times] of results.entries())

    console.log('%s occurs %s times', number, times);





// counting objects



people = [

    {name: 'Mary', gender: 'girl'},

    {name: 'John', gender: 'boy'},

    {name: 'Lisa', gender: 'girl'},

    {name: 'Bill', gender: 'boy'},

    {name: 'Maklatura', gender: 'girl'}

];





chessChampions = {

    2010: people[0],

    2012: people[0],

    2013: people[2],

    2014: people[0],

    2015: people[2],

};



results = new Counter(Object.values(chessChampions));

for (let [person, times] of results.entries())

    console.log('%s won %s times', person.name, times);



// you can also provide a classifier as in the above



byGender = new Counter(people, x => x.gender);

for (let g of ['boy', 'girl'])

   console.log("there are %s %ss", byGender.get(g), g);

的类型感知实现Counter可以如下所示(Typescript):

type CounterKey = string | boolean | number;

interface CounterKeyFunc<T> {
    (item: T): CounterKey;
}

class Counter<T> extends Map<CounterKey, number> {
    key: CounterKeyFunc<T>;

    constructor(items: Iterable<T>, key: CounterKeyFunc<T>) {
        super();
        this.key = key;
        for (let it of items) {
            this.add(it);
        }
    }

    add(it: T) {
        let k = this.key(it);
        this.set(k, (this.get(k) || 0) + 1);
    }
}

// example:

interface Person {
    name: string;
    gender: string;
}


let people: Person[] = [
    {name: 'Mary', gender: 'girl'},
    {name: 'John', gender: 'boy'},
    {name: 'Lisa', gender: 'girl'},
    {name: 'Bill', gender: 'boy'},
    {name: 'Maklatura', gender: 'girl'}
];


let byGender = new Counter(people, (p: Person) => p.gender);

for (let g of ['boy', 'girl'])
    console.log("there are %s %ss", byGender.get(g), g);


 类似资料:
  • 本文向大家介绍使用JavaScript查找数组中对象属性的值出现的次数?,包括了使用JavaScript查找数组中对象属性的值出现的次数?的使用技巧和注意事项,需要的朋友参考一下 为此,请使用的概念。以下是代码- 示例 要运行以上程序,您需要使用以下命令- 在这里,我的文件名为demo144.js。 输出结果 这将产生以下输出-

  • 给定类 我想添加一个方法,该方法计算列表中某个数字出现的次数。我尝试了以下方法,但它并不总是有效的,我不确定我做错了什么。 此方法适用于,(它应该返回) 但对于,,则返回。

  • 本文向大家介绍写一个函数找出给定数组中的最大差值相关面试题,主要包含被问及写一个函数找出给定数组中的最大差值时的应答技巧和注意事项,需要的朋友参考一下 function getMax(arr){ for(let i=arr[arr.length-1];i>0;i--){ for(let j=0;j<arr.length-i-1;j++){ if(arr[j]>arr[j+1]){ let temp

  • 我有一个类似这样的json响应: 我想检查,如果某个数组数组有一个对象,其属性名为“某个属性”,值为“某个值”,但如果它有另一个具有相同属性但不相同值的对象,则不要失败测试。 有可能吗?在此之前,我一直使用静态索引,因为我在该数组中只有一个元素。

  • 问题内容: 我想知道Java数组中是否有本机方法来获取给定值的表索引? 假设我的表格包含以下字符串: 假设用户必须输入汽车的类型,然后在后台程序将使用该字符串并获取其在数组中的位置。 因此,如果该人进入:轿车它应该处于位置0并将其存储在由我的程序创建的Cars对象中… 问题答案: 这之后是您的汽车的数组索引,如果不存在则为-1。

  • 计算数组中值的出现次数。 每次遇到数组中的某个特定值时,使用 Array.reduce() 来递增计数器。 const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a + 0), 0); countOccurrences([1, 1, 2, 1, 2, 3], 1); // 3