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

需求

有这么两个数组

let metrodates = [
 "2008-01",
 "2008-02",
 "2008-03",..ect
];
let figures = [
 0,
 0.555,
 0.293,..ect
]

想要这样的结果

 let result = [
    {data: 0, date: "2008-01"},
    {data: 0.555, date: "2008-02"},
    {data: 0.293, date: "2008-03"},..ect
 ];

方案一

 let result = [];
 for(let index in metrodates){
     result.push({data: figures[index], date: metrodates[index]});
 }

此方案为最原始方法,简单,但过于low

方案二

let result = metrodates.map((date,i) => ({date, data: figures[i]}));

此方案使用了ES6中的map,简洁,但本质还是遍历,显得有些low

方案三

const zip = ([x,...xs], [y,...ys]) => {
  if (x === undefined || y === undefined)
    return [];
  else
    return [[x,y], ...zip(xs, ys)];
}
let result = zip(metrodates, figures).map(([date, data]) => ({date, data}));

此方案使用了ES6+递归,显得高大上起来了。

方案四

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 result = map((date, data) => ({date, data}), metrodates, figures);

此方案是方案三的加强版,它能接受多个数组映射成对象数组,威力无比!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值