ES6将两个数组合并成一个对象数组
最近在写高德地图,遇到很多经纬度,地址这样子的数据, 会用到很多操作数组,对象的功能, 正好在今天用到了这个将两个数组合并成一个对象数组功能,在网上搜罗了很多方法, 下面总结了一下。
需求:
mlnglats = [
"116.946362,40.26223",
"116.512402,39.812221"
]
mformattedAddress = [
"北京市密云区东邵渠镇木邵路",
"北京市大兴区北京经济技术开发区北京鸿禧国际高尔夫俱乐部"
]
想要这样子的结果:
let ret =[
{
lnglats: "116.946362,40.26223",
formattedAddress: "北京市密云区东邵渠镇木邵路"
},
{
lnglats: "116.512402,39.812221",
formattedAddress: "北京市大兴区北京经济技术开发区北京鸿禧国际高尔夫俱乐部"
}
]
方案1
let ret = [];
for(let index in mlnglats){
ret.push({lnglats: mlnglats[index], formattedAddress: mformattedAddress[index]});
}
ps: 此方案比较简单易懂,但是对于代码有要求的人逼格差的太远了对吧,?
方案2
let ret = mlnglats.map((lnglats,i) => ({lnglats, formattedAddress: mformattedAddress[i]}));p
ps:方案使用了ES6中的map,简洁,但本质还是遍历,逼格稍微彰显了一些,但是还是显得有些low
方案3
const zip = ([x,...xs], [y,...ys]) => {
if (x === undefined || y === undefined)
return [];
else
return [[x,y], ...zip(xs, ys)];
}
let ret = zip(mlnglats, mformattedAddress).map(([formattedAddress, lnglats]) => ({formattedAddress, lnglats}));
ps: 此方案使用了ES6+递归,显得高大上起来了,逼格立刻上来了吧。
方案4
const isEmpty = xs => xs.length === 0;
const head = ([x,...xs]) => x;
const tail = ([x,...xs]) => xs;
const map = (f, ...xxs) => {
let loop = (acc, xxs) => {
if (xxs.some(isEmpty))
return acc;
else
return loop([...acc, f(...xxs.map(head))], xxs.map(tail));
};
return loop([], xxs);
}
let ret = map((lnglats, formattedAddress) => ({lnglats, formattedAddress}), mlnglats, mformattedAddress);
ps: 此方案是方案三的加强版,它能接受多个数组映射成对象数组,威力无比!!!
如果有大牛有更好的方案,记得分享哦!