主要功能是
比如数组有:
['a', 'b', 'b', 'c', 'b', 'b', 'b','d','f','f]
那么我需要得到 b 的连续的index 1-2 4-7 和f 的连续index 9 -10
方法一
/** * 把对象内内容加入到数组中 * @param arr 旧的数组 * @param obj 新的对象 */function getNewArr(arr,obj){ Object.keys(obj).map(s => { arr.push(obj[s]) }) return arr}/** * 获取数组连续重复内容的index * @param arr 数组 */function getStartEndIndex(arr){ var newArr = []; var obj = {} arr.map((v, index) => { // 如果obj里面有这字符了 if (obj[v]) { // 判断数组上一个字符是否等于当前字符,如果不等于,代表一个新的重复,则先把obj内容添加入数组,再初始化obj, if (arr[index - 1] == v) { obj[v].end = index } else { // 把内容加入数组 重新初始化obj ,再走下面内容 newArr= getNewArr(newArr,obj) obj = {} obj[v] = {} obj[v].name = v obj[v].start = index } } else { // 如果当前值未出现过,则添加到obj obj[v] = {} obj[v].name = v obj[v].start = index } }); newArr= getNewArr(newArr,obj).filter(v=>v.end) return newArr}var arr = ['a', 'b', 'b', 'c', 'b', 'b', 'b']const newArr =getStartEndIndex(arr)console.log(newArr)
方法二
其实是重新排序,就能保证每个都只会出现一次!
var arr = ['a', 'b', 'b', 'c', 'b', 'b', 'b'] arr = arr.sort((a, b) => a - b) let newObj = arr.reduce(function (item, next, index) { if (item[next]) { item[next].end = index; } else { item[next] = {} item[next].name = next item[next].start = index } return item }, {}) console.log(newObj)