Посчитайте повторение элемента в массиве, используя функцию с одним параметром - PullRequest
0 голосов
/ 19 февраля 2019

Добрый день, я пытаюсь подсчитать, сколько раз появляется определенный элемент в массиве.Я пытался, но мой код ниже учитывает только один массив, даже если он появляется более одного раза (это не проблема).Я хочу, чтобы он возвращал количество времени, в течение которого появляется каждый элемент.Например,

let arr = [1, 3, 2, 1];

это должно вернуть

{1:2} {3:1} {2:1}

Мой код возвращает 3 (так как он просто не учитывает один дважды)

Как мне поступитьэто?

Ниже мой код

function numberCount(number) {
    let count = 0;
    number.forEach(function (item, index) {
        if (number.indexOf(item) == index) count++;
    });
    console.log(count);
}

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вы должны filter из этих чисел, а затем использовать length:

let arr = [1, 3, 2, 1];

function itemCount(array) {
  var sorted = array.sort()
  var uniqueCount = sorted.filter((v, i, a) => a.indexOf(v) == i);
  var count = [];
  uniqueCount.forEach(item => {
    var itemCount = sorted.filter(e => e == item).length;
    count.push({[item]: itemCount});
  });
  return count;
}

console.log(itemCount(arr));
0 голосов
/ 19 февраля 2019

Я бы предложил не изобретать велосипед, а вместо этого использовать lodash, который уже имеет эту функцию.Используя countBy(), вы получите объект, который затем сможете конвертировать в желаемый результат.Например:

const arr = [1, 3, 2, 1]
const count = _.countBy(arr)
const result = Object.keys(count).map(k => ({ [k]: count[k] }))

console.log(result)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
0 голосов
/ 19 февраля 2019

Итерируя по number (лучше назвать его arr, это массив, а не число), используйте объект для отслеживания того, сколько раз каждое число встречалось до сих пор.Затем итерируйте получившийся объект entries, чтобы создать нужные объекты:

let arr = [1, 3, 2, 1];
function numberCount(arr) {
    let count = 0;
    const obj = arr.reduce((a, num) => {
      a[num] = (a[num] || 0) + 1;
      return a;
    }, {});
    return Object.entries(obj).map(([key, val]) => ({ [key]: val }));
}
console.log(numberCount(arr));

Цифровые клавиши всегда идут в цифровом порядке в объекте.Если вы хотите, чтобы объекты в выходных данных имели порядок вставка (например, объект с ключом 3 перед объектом с ключом 2), тогда используйте Map вместо объекта (ключи карты будут перебираться в порядке вставки):

let arr = [1, 3, 2, 1];
function numberCount(arr) {
    let count = 0;
    const map = arr.reduce((a, num) => (
      a.set(num, (a.get(num) || 0) + 1)
    ), new Map());
    return [...map.entries()]
      .map(([key, val]) => ({ [key]: val }));
}
console.log(numberCount(arr));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...