一天一个仿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))
}

posted @ 2022-07-04 16:42  Dont  阅读(42)  评论(0编辑  收藏  举报