Как вы объединяете определенные элементы в массиве JavaScript? - PullRequest
0 голосов
/ 21 февраля 2019

Скажем, у вас есть следующий массив:

const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

Как бы вы изменили этот массив, чтобы все элементы "b" группировались вместе, пока вы не нажмете другую "a".

Таким образом, результат приведенного выше массива будет выглядеть следующим образом:

['a', 'a', 'bbb', 'a', 'bb', 'a'];

Я пытаюсь решить проблему с переносом тегов span вокруг слов, которые соответствуют шаблону в приложении React, но это по сути моя проблема.

Я работал над этим целую вечность, но не могу придумать ничего, чем я доволен.

Есть идеи?

Приветствие.

Ответы [ 8 ]

0 голосов
/ 21 февраля 2019

Вы можете просто отобразить массив ab и, если текущий элемент равен a, переместить его в новый массив, но если текущий элемент равен b, проверьте, является ли предыдущий элемент b или нети, если это так, объедините текущий элемент с предыдущим элементом, иначе просто нажмите b в новый массив.

const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

let arr = [];

ab.map((e,i) => {
  if(i > 0) { // check if element is the first one or not
    if(e == "b") { 
      if(ab[i - 1].indexOf('b') > -1) { // check if prev element is "b" or not
      	arr[arr.length-1] += e; // merge if prev element is "b"
      } else {
      	arr.push(e);
      }
    } else {
      arr.push(e);
    }
  } else {
  	arr.push(e);
  }
});

console.log(arr);

NB Подход с использованием метода reduce() и подход regex, показанные в других ответах, являются более четкими и краткими по сравнению сметод map(), показанный выше, хотя.

0 голосов
/ 21 февраля 2019

Предполагая, что элементы всегда будут состоять из одних букв, вы можете объединить элементы, а затем сопоставить либо b s, либо не- b s:

ab.join('').match(/(b+|.)/g)

const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

let output = ab.join('').match(/(b+|.)/g);

console.log(output);
0 голосов
/ 21 февраля 2019

вы можете stringify ваш массив, затем разделить его на совпадение b или более или любой другой символ

const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

const res = ab.join("").match(/(b{1,}|.)/g);

console.log(res)
0 голосов
/ 21 февраля 2019

Вот что вы ищете:

var ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

var index = 0;
var groupedArray = [];
var firstOccurence = true;
var groupedString = "";
var grouping = false;
for (var a = 0; a < ab.length; a++) {

  if (ab[a] == "a") {
    if (grouping) {
      grouping = false;
      firstOccurence = true;
      groupedArray.push(groupedString);
    }
    groupedArray.push(ab[a]);
  } else {
    if (firstOccurence) {
      groupedString = "";
      firstOccurence = false;
    }
    groupedString += ab[a];
    grouping = true;
  }
}
console.log(groupedArray);
0 голосов
/ 21 февраля 2019

Я не знаю, как дать объяснение этому, но используя сокращение, вы можете сделать это так:

const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

function merge(arr) {
  return arr.reduce((acc,cur, index) => {
    if(arr[index - 1] === 'b' && cur !== 'a') {
      acc[acc.length - 1] = acc[acc.length - 1] + cur;
      return acc;
    }
    acc.push(cur);
    return acc;
  },[]);
}

console.log(merge(ab))
0 голосов
/ 21 февраля 2019

Если вы хотите просто объединить b, вы можете использовать reduce, например:

Если текущий элемент и предыдущий элемент b, то добавьте его к последнему элементу аккумулятора.Иначе, подтолкни его к аккумулятору

const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a']

const output = ab.reduce((acc, c, i, arr) => {
  arr[i-1] === "b" && c === "b" 
    ? acc[acc.length - 1] += c
    : acc.push(c)
    
  return acc;
},[])

console.log(output)
0 голосов
/ 21 февраля 2019

Используя Массив # уменьшите вы можете сделать что-то вроде этого.

Я предполагаю, что первые два символа в вашем решении были опечаткой.

const data = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

const res = data
.reduce((a,c)=>{
  const lastIndex = a.length - 1;
  if(a[lastIndex] && a[lastIndex].includes('b') && c === 'b') a[lastIndex] += c;
  else a.push(c);
  return a;
}, []);

console.log(res);
0 голосов
/ 21 февраля 2019

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

 const result = [];
 let curr = array[0], count = 1;

 for(const el of array.slice(1).concat(undefined)) {
   if(el !== curr || el !== "b") {
     result.push(curr.repeat(count));
     curr = el, count = 1;
   } else count++;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...