输入:
['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e']
所需的输出:
['aaa', 'bb', 'ccc', 'd', 'ee']
这可能吗?
编辑:我忘了提一下,我先前的尝试(例如另一个例子)失败了,我也不知道为什么:
let newArr = []
let last
let current
for (var i = 0; i < arr.length; i ++) {
last = last || isCurrencyArr[i]
current = isCurrencyArr[i]
let str = ''
if (last === current) {
str += arr[i]
} else {
newArr.push(str)
str = ''
}
last = isCurrencyArr[i]
}
答案 0 :(得分:1)
您的示例有一些小问题。它在每次迭代内重新声明str
,因此它只推送空字符串。另外,当遇到 new 项时,它会推入前一个字符串,但不能解释最后一项相同的情况,例如在示例中带有字母e
的情况
如果将相似的元素连接在一起,无论位置如何……
相反,您可以使用reduce()
和spread syntax for object literals来构建一个跟踪每个项目的出现的对象。
reduce()
之后的对象看起来像这样:
{ a: "aaa", b: "bb", c: "ccc", d: "d", e: "ee" }
建立对象后,我们要做的就是使用Object.values()
根据值创建一个数组。
const arr = ['a', 'b', 'a', 'c', 'b', 'a', 'e', 'd', 'c', 'e', 'c'];
let items = arr.reduce((acc,i) => acc[i] ? {...acc, [i]: acc[i]+i } : {...acc, [i]: i }, {});
let result = Object.values(items);
console.log(result);
如果您只想加入相邻相似的元素...
下面的示例使用与上面类似的方法,但是 this reduce()
输出一个字符串。逻辑类似于您自己的示例:如果上一项相同,则将其添加到字符串中。如果不是 ,请将其分开并继续。
结果是这样的:aaa|bb|ccc|d|ee
。要将其转换为数组,我们只需要执行split("|")
。
const arr = ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e'];
let result = arr
.reduce((acc,i,idx,a) => (a[idx-1] === i || idx===0) ? acc+i : acc+"|"+i, "")
.split("|");
console.log(result);
答案 1 :(得分:0)
使用Array#reduce,spread syntax和Map。
const data = ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e'];
const res = [...data.reduce((a,c)=>{
return a.set(c, (a.get(c)||"") + c);
}, new Map()).values()];
console.log(res);
const data = ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e'];
const res = [];
for(let i = 0; i < data.length; i++){
const c = data[i];
let str = c;
for(let j = i + 1; j < data.length && c === data[j]; j++,i++){
str += c;
}
res.push(str);
}
console.log(res);
答案 2 :(得分:0)
这可能是加入相邻元素的解决方案:
const arr = ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'e', 'e'];
const resp = arr.reduce((a, e) => {
if(a.length === 0) return a.concat(e);
if(e === a[a.length - 1].split('').reverse()[0]) {
a[a.length - 1] = a[a.length - 1].split('').concat(e).join('');
return a;
}
return a.concat(e);
}, [])
console.log(resp);
答案 3 :(得分:0)
类似的事情应该起作用:
function simplify(arr) {
let current = arr[0];
let final_arr = [];
let accumulated = current;
for (let i = 1; i < arr.length; i += 1) {
if (current === arr[i]) {
accumulated += arr[i];
} else {
final_arr.push(accumulated)
current = arr[i];
accumulated = current;
}
}
final_arr.push(accumulated);
return final_arr;
}