求一个算法 计算连续属性相同的所形成的新数组

求个算法 把相邻的 first 值的对象的时间首位形成数组,已经给出期待结果.

//原数组
const arr = [
      {
        first: 1,
        time: '2021-05-27T02:13:52Z',
      },
      {
        first: 1,
        time: '2021-05-27T02:23:52Z',
      },
      {
        first: 1,
        time: '2021-05-27T02:33:52Z',
      },
      {
        first: 2,
        time: '2021-05-27T02:43:52Z',
      },
      {
        first: 2,
        time: '2021-05-27T02:53:52Z',
      },
      {
        first: 3,
        time: '2021-05-27T03:03:52Z',
      },
      {
        first: 3,
        time: '2021-05-27T03:13:52Z',
      },
      {
        first: 2,
        time: '2021-05-27T03:23:52Z',
      },
      {
        first: 2,
        time: '2021-05-27T03:33:52Z',
      },
    ];
    //期待的结果
    const res = [
      {
        first: 1,
        time: ['2021-05-27T02:13:52Z', '2021-05-27T02:43:52Z'],
      },
      {
        first: 2,
        time: ['2021-05-27T02:43:52Z', '2021-05-27T03:03:52Z'],
      },
      {
        first: 3,
        time: ['2021-05-27T03:03:52Z', '2021-05-27T03:23:52Z'],
      },
      {
        first: 2,
        time: ['2021-05-27T03:23:52Z', '2021-05-27T03:33:52Z'],
      },
    ];
阅读 1.9k
4 个回答

-

const handler = (arr) => {
    const res = [];
    arr.sort((a, b) => new Date(a.time).getTime() - new Date(b.time).getTime());
    arr.forEach(r => {
        let rr = res.length ? res[res.length - 1] : null;
        if (!rr || rr.first !== r.first) {
            rr = {first: r.first, time: []};
            res.push(rr);
        }
        rr.time.push(r.time);
    })
    return res;
}

-

const handler = (arr) => {
    const res = []
    let curFirst = -1
    let time = []
    arr.forEach(i => {
        if (i["first"] !== curFirst) {
            if (curFirst !== -1) {
                res.push({first: curFirst, time: time})
            }
            curFirst = i["first"]
            time = []
        }
        time.push(i["time"])
    })

    res.push({first: curFirst, time: time})
    return res;
}
function assginFirst(arr) {
    let tempObj = {};
    arr.forEach(item => {
        if(tempObj[item.first]) {
            tempObj[item.first].push(item.time);
        } else {
            tempObj[item.first] = [item.time];
        }
    });
    return Object.keys(tempObj).map(key => ({
        'first': key,
        'time': tempObj[key]
    }))
}

自问自答一下吧~突来灵感 解决了

const arrInit = (arr) => {
      let prevObj = arr[0]; //默认第一个
      let hasOther = true; //查看后续数组 是否值都相同
     
      const res = arr.reduce((prev, next, index) => {
        if (!hasOther) return prev; //如果没有其他值 则直接返回
        if (next.first !== prevObj.first) {
          const time = [prevObj.time, next.time];
          prev.push({
            ...prevObj,
            time,
          });
          prevObj = next;
        }
        //查看后续数组 是否值都相同--我觉得是关键代码~~
        const data = arr.slice(index);
        hasOther = data.find((item) => item.first !== prevObj.first);
        if (!hasOther) {
          const pop = data.pop();
          const time = [prevObj.time, pop.time];
          prev.push({
            ...prevObj,
            time,
          });
        }
        return prev;
      }, []);
      return res;
    };
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题