假设您有以下数组:
const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];
您将如何更改此数组,以便将所有“ b”项组合在一起,直到您击中另一个“ a”。
因此上述数组的结果如下:
['a', 'a', 'bbb', 'a', 'bb', 'a'];
我正在尝试通过在与React应用程序中的模式匹配的单词周围包裹跨度标签来解决问题,但这基本上是我的问题。
我已经为此工作了很长时间,但是无法提出我满意的任何东西。
有什么想法吗?
干杯。
答案 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()
方法更简洁但是。