前面說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))
}