функция для подсчета вхождений или частоты элемента и возврата объекта, но удаления элементов, которые встречаются один, и возврата остальных - PullRequest
0 голосов
/ 10 февраля 2020

так что у меня есть эта функция

function counting(arr) {
  result = {};
  for (var i = 0; i < arr.length; i++) {
    if (!result[arr[i]]) result[arr[i]] = 0;
    ++result[arr[i]];
  }
  return result;
}

arr = [1, 2, 3, 4, 6, 6, 7, 8, 9, 5, 2, 6, 1, 8]
console.log(counting(arr))

я получаю этот результат

{ '1': 2,
  '2': 2,
  '3': 1,
  '4': 1,
  '5': 1,
  '6': 3,
  '7': 1,
  '8': 2,
  '9': 1 }

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

{ '1': 2,
  '2': 2,
  '6': 3,
  '8': 2}

Ответы [ 3 ]

1 голос
/ 10 февраля 2020

Вы можете сделать это с одним l oop, имея две отдельные карты частот.

function counting(arr) {
    const [freq, result] = [{}, {}];
    arr.forEach(i => {
        freq[i] = (freq[i] || 0) + 1;
        if (freq[i] > 1) result[i] = freq[i];
    });

    return result;
}
0 голосов
/ 10 февраля 2020

Вы можете разбить его на пару функций:

  1. Функция для получения частоты элементов в массиве.
  2. Функция, которая отбрасывает свойства не больше 1.

const test = [1, 2, 3, 4, 6, 6, 7, 8, 9, 5, 2, 6, 1, 8]

const frequency = arr =>
  arr.reduce((o, x) => {
    o[x] = (o[x] || 0) + 1
    return o
  }, {})

const dropSingleOccurrences = counts =>
  Object.entries(counts).reduce((o, [k, v]) => {
    if (v > 1) o[k] = v
    return o
  }, {})

const result = dropSingleOccurrences(frequency(test))

console.log(result)
0 голосов
/ 10 февраля 2020

Итак, l oop над вашим набором результатов и снова уменьшите его.

const arr = [1,2,3,4,6,6,7,8,9,5,2,6,1,8]

const counts = arr.reduce(function (o, n) {
  o[n] = o[n] || 0;
  o[n]++
  return o
}, {})
const result = Object.entries(counts)
  .reduce(function (o, v) {
    if (v[1] > 1) {
      o[v[0]] = v[1]
    }
    return o
  }, {})

console.log(result)
...