如何合并JavaScript数组中的某些项目?

时间:2019-02-21 16:44:15

标签: javascript arrays sorting ecmascript-6

假设您有以下数组:

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

您将如何更改此数组,以便将所有“ b”项组合在一起,直到您击中另一个“ a”。

因此上述数组的结果如下:

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

我正在尝试通过在与React应用程序中的模式匹配的单词周围包裹跨度标签来解决问题,但这基本上是我的问题。

我已经为此工作了很长时间,但是无法提出我满意的任何东西。

有什么想法吗?

干杯。

8 个答案:

答案 0 :(得分:3)

计算重复出现的次数,然后基于此结果:

 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++;
 }

答案 1 :(得分:3)

假设元素始终为单个字母,则可以合并元素,然后在b或非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);

答案 2 :(得分:0)

使用Array#reduce,您可以执行以下操作。

我假设您解决方案中的前两个字符是错字。

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);

答案 3 :(得分:0)

如果您只想合并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)

答案 4 :(得分:0)

我不知道如何对此进行解释,但是使用reduce可以做到这一点:

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))

答案 5 :(得分:0)

这就是你所追求的:

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);

答案 6 :(得分:0)

您可以stringify数组,然后用匹配b或更多或任何其他字符进行拆分

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

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

console.log(res)

答案 7 :(得分:0)

您可以仅映射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()方法更简洁但是。