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