面试题:js数组数据处理

[{number:1},{number:2},{number:2}, {number:3},{number:3},{number:3}]

变为下面


[{number:1,index:'0'},{number:2,index:'1-2'},{number:3,index:'3-5'}]

如何处理?

阅读 3.4k
5 个回答

查看demo

let arr = [
  { number: 1 },
  { number: 2 },
  { number: 2 },
  { number: 3 },
  { number: 3 },
  { number: 3 }
];
let newArr = arr.reduce((a, c, index) => {
  let finddx = a.findIndex((e) => e.number === c.number);
  if (finddx === -1) {
    a.push({ ...c, index: "" + index, start: index });
  } else {
    a[finddx].index = a[finddx].start + "-" + index;
  }
  if (index === arr.length - 1) {
    a = a.map((el) => {
      return {
        number: el.number,
        index: el.index
      };
    });
  }
  return a;
}, []);
console.log(newArr);
const data1 = [{number:1},{number:2},{number:2}, {number:3},{number:3},{number:3}]

function _collect(data, prefix) {
     // 初始化
     const dealMap = data.reduce((accMap, cur, curIndex) => {
         const accMapKey = cur[prefix]
         const accMapValue = accMap.get(accMapKey)
         // set
         accMap.set(accMapKey, accMap.has(accMapKey) ? [...accMapValue, curIndex].sort() : [curIndex])
         return accMap
     }, new Map())
     // 遍历
     return [...dealMap].map(([target, targetScope]) => {
         const length = targetScope.length
         const min = targetScope[0]
         const max = targetScope[length - 1]
         return {
            [prefix]: target,
            index: min === max ? String(min) : `${min}-${max}`
         }
     })
}

console.log(_collect(data1, 'number'))
function getArr(arr) {

     let brr = arr.reduce((a, b, index) => {

         let number = b.number, ln = a.lastNumber;

         if (b.number === ln) {

             let len = a.length, lo = a[len - 1], st = lo.index.split('-')[0];

             a.splice(len - 1, 1, {number: b.number, index: `${st}-${index}`})

         } else {

            a.push({number: number, index: index + ''})

         }

         a.lastNumber = b.number;

         return a;

     }, [])

     delete brr.lastNumber

     return brr;

}

getArr([{number:1},{number:2},{number:2}, {number:3},{number:3},{number:3}])

先排序,后通过reduce处理数据,返回

{
    number:1,
    index:[]
}

结构,后续再转成自己想要的数据格式

(function(){
  let org_array=[{number:1},{number:2},{number:2}, {number:3},{number:3},{number:3}];
  function convert(orgArray){
    return orgArray.sort((itemA,itemB)=>{
        return itemA.number - itemB.number;
    }).reduce((result,currentItem,index)=>{
        let prevIndex = result.length-1;
        let prev = result[prevIndex];
        let prevNum=null;
        if(prev){
            prevNum = prev.number;
        };
        let currentNum = currentItem.number;
        if(currentNum===prevNum){
            result.splice(prevIndex,1,Object.assign({},prev,{
                index:[...prev.index,index]
            }))
        }else{
            result.push(Object.assign({},currentItem,{
                index:[index]
            }));
        }
        
        return result;
        
    },[]);
  }
  
  let result = convert(org_array);
  console.log('result:',result);
  console.log(result.map((item)=>{
    return {
        number:item.number,
        index:item.index.length===1?`${item.index[0]}`:`${item.index[0]}-${item.index[item.index.length-1]}`
    }
  }))

}());
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题