JavaScript, объединить совпадающие элементы в массив

var binary = [1,0,0,1,1,1,0,0,1,0];

У меня есть функция, которая производит случайный массив бит. Я хотел бы объединить совпадающие элементы и вернуть массив, в котором указано, сколько элементов было повторено. Вышеупомянутое дает результат = [1,2,3,2,1,1].

Есть ли в JavaScript какие-нибудь функции, которые позволили бы мне это сделать? Я пробовал искать, но не совсем уверен, как описать то, что хочу. Спасибо.

Итерировать и считать? Я имею в виду, что это базовый RLE без ссылки на то, что вы кодируете, верно?

Dave Newton 09.06.2018 18:38

в качестве примечания, оба массива могут быть легко сгенерированы в одном цикле

Slai 09.06.2018 20:18
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
151
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вы можете использовать метод reduce() и сохранить последний элемент в одной переменной.

var binary = [1, 0, 0, 1, 1, 1, 0, 0, 1, 0];
let last = null;

var result = binary.reduce((r, e) => {
  if (last == null || last != e) r.push(1);
  else r[r.length - 1]++;
  last = e;
  return r;
}, [])

console.info(result)

Попробуйте следовать

var binary = [1,0,0,1,1,1,0,0,1,0];

var result = []; // result array
var value = binary[0]; // initial value
var counter = 1; // counter of the values
// Start the loop with 2nd value
for (var i = 1; i < binary.length; i++) {
  // if the value in array is same as stored value, increment counter
  if (value === binary[i]) {
    counter++;
  } else {
  /* if the value is different, push the counter in result 
  ** and reset value and counter */
    result.push(counter);
    value = binary[i];
    counter = 1;
  }
}

console.info(result);

Вы можете проверить последний элемент при уменьшении массива и либо нажать увеличенное последнее значение, либо взять 1 для объединения.

var binary = [1, 0, 0, 1, 1, 1, 0, 0, 1, 0],
    result = binary.reduce((r, v, i, a) => r.concat((a[i - 1] === v && r.pop()) + 1), []);

console.info(result);

это способ, который я нашел, чтобы проверить, что двоичный файл в массиве постоянно повторяется или нет

    var output = [1,0,0,1,1,1,0,0,1,0];
    var result = []
    var counter = 1;
    for(i=0;i<output.length;i++){
        if (output[i] === output[i+1])
            counter++;
        else{
            result.push(counter);
            counter=1;
            }
     }
     console.info(result)

вот результат [1, 2, 3, 2, 1, 1] и этот код прост для понимания

Опишите свое решение. Сообщение только с кодом не завершено

alamoot 09.06.2018 19:44

сначала он соответствует первому символу массива со вторым, если он сопоставлен, тогда счетчик увеличится на 1 (в нашем случае он не сопоставлен), если не сопоставлен счетчик push, чтобы результат, который изначально был пуст, и присвоить счетчику 1 (почему счетчик 1? Потому что если нет совпадений, то есть хотя бы один символ)

manan5439 09.06.2018 20:05

@alamoot Иногда я соглашусь; в этом случае, поскольку это явно уже домашнее задание, добавление объяснения делает ответ даже худший, потому что оно снимает даже более бремени OP с фактического учить.

Dave Newton 09.06.2018 22:22

@ Дэйв, это личный проект, а не домашнее задание. Четко.

Future 10.06.2018 14:16

@ В будущем я понимаю. Лично я бы потратил на это больше времени, прежде чем сдаться, и также включил бы ваши лучшие усилия в вопрос, но это только я. И это очень странный «личный проект», но у меня есть и более странные, так что кто я такой, чтобы судить.

Dave Newton 10.06.2018 14:29

Немного короче и медленнее:

console.info( [1,0,0,1,1,1,0,0,1,0].join('').match(/0+|1+/g).map(m => m.length) )

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