подсчет повторяющихся символов в JavaScript без циклов и мутаций - PullRequest
0 голосов
/ 27 сентября 2019

Мне нужно посчитать повторяющиеся символы в таком примере, получить массив и вернуть объект.Пример: входные данные: ['a', 'b', 'a', 'v'] выходные данные: {a: 2, b: 1, v: 1}, циклы не могут использоваться, а также мутации или жесткиеприсваивание значения массива в рамках Reduce.Теперь мой код выглядит так, но он не работает.

(arr) => {
  const arr2 = arr.filter((v, i, a) => a.indexOf(v) === i).map(v => [v, arr.filter(x => x === v).length
  ]) // [["a",2],["b",1],["v",1]]
  const obj = Object.fromEntries(arr2)
  return obj //undefined
}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Вам не нужен indexOf, только карта и фильтр:

let arr = [...'abcxcbaa']

cnt = Object.fromEntries(
    arr.map(c =>
        [c, arr.filter(d => d === c).length]
    )
)

console.log(cnt)

Другая идея - reduce + объект-аккумулятор:

let arr = [...'abcxcbaa']

cnt = arr.reduce((r, c) => ({
    ...r,
    [c]: (r[c] || 0) + 1
}), {})

console.log(cnt)
0 голосов
/ 27 сентября 2019

Вы можете получить этот вывод из простой логики Array.forEach() без необходимости использования map(), filter() или любых вложенных циклов.

let arr = [ 'a', 'b', 'a', 'v'];
let resultObj = {};
arr.forEach((item) => {
  if(resultObj[item]) {
    resultObj[item]++;
  } else {
    resultObj[item] = 1;
  }
});
console.log(resultObj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...