JavaScript在数组中连接相同的相邻元素

时间:2019-01-22 02:00:51

标签: javascript arrays join element

输入:

['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]
}

4 个答案:

答案 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#reducespread syntaxMap

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