js 判断数组字符连续出现位置的前后index

主要功能是

比如数组有:

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


相关内容

发表评论

验证码:
点击我更换图片

最新评论