Группировка одинаковых значений из массива JavaScript

let array = ['a', 'a', 'a', 'b', 'b', 'c'];

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

результат: ['3a, 2b, c']
(или что-то подобное)

Любая идея?

вы действительно хотите, чтобы в результате была одна строка в массиве? что ты пробовал?

Nina Scholz 04.12.2018 14:31

@NinaScholz именно это

nemanman 05.12.2018 08:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
835
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я бы рекомендовал использовать словарь для отслеживания повторяющихся значений в массиве.

var dictionary = {};
for(var i = 0;i < array.length;i++){
   var value = array[i];
   if (dictionary[value] === undefined){
      dictionary[value] = 0;
   }
   dictionary[value] = dictionary[value] + 1;

}
console.info(dictionary)
Ответ принят как подходящий

Вы можете использовать методы .reduce() и .map():

let array = ['a', 'a', 'a', 'b', 'b', 'c'];

let result = Object.entries(
    array.reduce((r, c) => (r[c] = (r[c] || 0) + 1, r) , {})
).map(([k, v]) => v == 1 ? k : v + k);

console.info(result);

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

let array = ['a', 'a', 'a', 'b', 'b', 'c'];

let result = (((arr, map) => {
    arr.forEach(s => map.set(s, (map.get(s) || 0) + 1));
    return [...map.entries()].map(([k, v]) => v == 1 ? k : v + k);
})(array, new Map()));

console.info(result);

Вы можете использовать Array.reduce() для создания объекта с парами ключ-значение (значение массива и счетчик), а затем Array.map() для создания массива с использованием Object.keys().

let array = ['a', 'a', 'a', 'b', 'b', 'c'];

let countObj = array.reduce((acc, val) => (acc[val] = acc[val] ? acc[val] + 1 : 1, acc), {});

console.info(countObj);

let countArr = Object.keys(countObj).map(key => '' + countObj[key] + key);

console.info(countArr);
function count() {
array_elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];
array_elements.sort();
var current_elements = null;
var count= 0;
for (var i = 0; i < array_elements.length; i++) {
    if (array_elements[i] != current_elements) {
        if (cnt > 0) {
            console.info(current_elements+count);
        }
        current_elements= array_elements[i];
        count= 1;
    } else {
        count++;
    }
}
if (cnt > 0) {
    console.info(current_elements+count);
}

}

Для «чего-то подобного» почему бы просто не создать объект, который сопоставляет букву с вхождением. Затем вы можете просто использовать точечную нотацию, чтобы получить значение свойства, присвоенное каждому ключу.

Здесь я использовал reduce.

const arr = ['a', 'a', 'a', 'b', 'b', 'c'];

// `reduce` over the arr
const obj = arr.reduce((acc, c) => {

  // If the object (acc) we passed in doesn't have
  // a key assigned to the letter in the current
  // iteration (c) add it, set it to 0, then
  // add one, otherwise, if there is a key, add one
  acc[c] = (acc[c] || 0) + 1;

  // Return the object for the next iteration
  return acc;

// Pass in an initial object 
}, {});

console.info(obj);

// Grab the value of `a` property
console.info(obj.a);

Подход с одним циклом для простой функции кодирование длин серий (RLE).

let array = ['a', 'a', 'a', 'b', 'b', 'c'],
    result = array.reduce(
        (r, c, i, a) => r.concat(c === a[i - 1]
            ? ((+r.pop().slice(0, -1) || 1) + 1) + c
            : c),
        []
    );

console.info(result);

Другие вопросы по теме