Подсчет количества повторений строки в массиве с использованием Lodash

1

У меня есть массив строк, которые являются тегами сообщений в блоге из базы данных.

Это пример конечного результата запроса:

["apple","banana", "apple", "orange","grapes","mango","banana"];

Мне нужно знать, сколько раз строка повторяется в этом массиве, поэтому я могу создать своего рода облако тегов.

Конечный конечный результат должен выглядеть так: [{name:"apple",count:2}, {name:"banana", count:2}, {name: "orange",count:1}...];

Я использую lodash в своем проекте и хотел бы использовать его, если это возможно. простой javascript тоже прекрасен.

Теги:
arrays
lodash

4 ответа

2
Лучший ответ

Вы можете использовать groupBy для тяжелого подъема, а затем использовать карту для форматирования результата по своему вкусу:

const data = ["apple", "banana", "apple", "orange", "grapes", "mango", "banana"];

const result = _.values(_.groupBy(data)).map(d => ({name: d[0], count: d.length}));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
1

Используйте reduce и map

var input = ["apple","banana", "apple", "orange","grapes","mango","banana"];

var map = input.reduce( (a,c) => ( a[c] = a[c] || 0, a[c]++, a ) ,{});

var output = Object.keys( map ).map( s => ({name: s, count:map[s]}) );

демонстрация

var input = ["apple", "banana", "apple", "orange", "grapes", "mango", "banana"];

var map = input.reduce((a, c) => (a[c] = a[c] || 0, a[c]++, a), {});

var output = Object.keys(map).map(s => ({
  name: s,
  count: map[s]
}));

console.log(output);
  • 0
    Ваш ответ правильный, однако ответ @ klugjo более читабелен.
0

Чтобы подсчитать использование _.countBy(), преобразуйтесь в запрошенную форму с помощью _.entries() и сопоставьте кортежи с объектами:

const data = ["apple", "banana", "apple", "orange", "grapes", "mango", "banana"];

const result = _.entries(_.countBy(data)).map(([name, count]) => ({ name, count }));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
0

Создайте карту, имя сопоставления для подсчета. Прокрутите список по каждому элементу, если его "на карте", увеличьте его количество, иначе установите его значение в единицу.

if (tag in map) { map[tag] += 1 }
else { map[tag] = 1 }

Затем вы можете выполнить итерацию карты и преобразовать ее в список объектов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню