Counting the occurrences / frequency of array elements

Проверьте pmtools сценарии на CPAN. При использовании Debian (-базирующийся) дистрибутив существует также удобное пакет pmtools . Это включает сценарий "pmvers", который говорит Вам версию модуля. Это довольно удобно.

Это делает что-то подобное различным отправленным людям острот, но это немного более умно об обработке ошибок и может дать Вам версию больше чем одного модуля сразу.

194
задан Emissary 1 June 2017 в 22:50
поделиться

3 ответа

Однолинейное решение ES6. Так много ответов, использующих объект в качестве карты, но я не вижу никого, кто бы использовал фактическую карту

const map = arr.reduce((acc, e) => acc.set(e, acc.get(e) + 1 || 1), new Map());

Используйте map.keys() , чтобы получить уникальные элементы

Используйте map.values() , чтобы получить события

Я надеюсь, что по крайней мере один человек найдет это полезным.

var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]

const map = arr.reduce((acc, e) => acc.set(e, acc.get(e) + 1 || 1), new Map());

console.log(...map.keys())
console.log(...map.values())
7
ответ дан 23 November 2019 в 05:22
поделиться

Этот вопрос более 8 лет , и многие, многие ответы на самом деле не учитывают ES6 и его многочисленные преимущества.

Возможно, еще более важно подумать о последствиях нашего кода для сбора мусора / управления памятью всякий раз, когда мы создаем дополнительные массивы, делаем двойные или тройные копии массивов. или даже конвертировать массивы в объекты. Это тривиальные наблюдения для небольших приложений, но если масштаб является долгосрочной целью, подумайте об этом тщательно.

Если вам просто нужен «счетчик» для определенных типов данных, а отправной точкой является массив (поэтому я предполагаю, что вы хотите упорядоченный список и воспользоваться множеством свойств и методов, предлагаемых массивами), вы можете просто просто переберите массив array1 и заполните array2 значениями и числом вхождений для этих значений, найденных в array1.

Так просто.

Пример простого класса SimpleCounter (ES6) для объектно-ориентированного программирования и объектно-ориентированного проектирования

class SimpleCounter { 

    constructor(rawList){ // input array type
        this.rawList = rawList;
        this.finalList = [];
    }

    mapValues(){ // returns a new array

        this.rawList.forEach(value => {
            this.finalList[value] ? this.finalList[value]++ : this.finalList[value] = 1;
        });

        this.rawList = null; // remove array1 for garbage collection

        return this.finalList;

    }

}

module.exports = SimpleCounter;
1
ответ дан 23 November 2019 в 05:22
поделиться

Используя Набор можно извлечь уникальные числа затем, можно отфильтровать вход для получения количества каждого числа:

input = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]
setOcc = new Set(input)
arrOcc = [...setOcc]
arrNumberOcc = arrOcc.map(occ => input.filter(e => e===occ).length);
console.log(arrOcc, arrNumberOcc)
2
ответ дан 23 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: