一天一個仿lodash函數實現-zip

前面說unzip其實就是數組轉置,那其實zip也就是逆向,那還是轉置了
導致zipObjectDeep費了點腦細胞,寫了個勉強過了官方文檔示例的實現。

function zip(...arr){
  const result = [];
  arr.forEach((item, index)=>{
    if(index===0){
      item.forEach(it=>result.push([it]))
    }else{
      item.forEach((it, si)=>result[si].push(it))
    }
  })
  return result;
}

function zipObject(props, values){
  const result = {};
  props.forEach((prop, index)=>{
    result[prop] = values[index]
  })
  return result
}
// 隨便實現
function zipObjectDeep(props, values){
  const result = {};
  props.forEach((prop, index)=>{
    const paths = prop.split('.');
    const len = paths.length;
    paths.reduce((pre, cur, pindex)=>{
      const match = cur.match(/(\w+)\[(\d+)\]/);
      if(match){
        if(!pre[match[1]]){
          pre[match[1]] = [];
        }
        if(pindex===len-1){
          pre[match[1]][match[2]] = values[index];
        } else {
          return pre[match[1]][match[2]] = {};
        }
      }else {
        if(pindex===len-1){
          pre[cur] = values[index];
        }else{
          if(!pre[cur]){
            pre[cur] = {};
          }
        }
      }
      return pre[cur]
    }, result);
  })
  return result
}

function zipWith(...args){
  const arr = args.slice(0, args.length-1);
  const fn = args[args.length-1];
  const result = [];
  arr.forEach((item, index)=>{
    if(index===0){
      item.forEach(it=>result.push([it]))
    }else{
      item.forEach((it, si)=>result[si].push(it))
    }
  })
  return result.map(item=>fn.apply(null, item))
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章