ES6将两个数组合并成一个对象数组

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: 此方案是方案三的加强版,它能接受多个数组映射成对象数组,威力无比!!!

如果有大牛有更好的方案,记得分享哦!

站内部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
赞赏是最好的支持
如果对你有帮助那就支持一下吧
立即赞赏
分享到:
赞(7) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

小月博客-一个专注于分享的技术博客
没有账号? 忘记密码?