zoukankan      html  css  js  c++  java
  • ES6将两个数组合并成一个对象数组

    需求

    有这么两个数组

     1 let metrodates = [
     2  "2008-01",
     3  "2008-02",
     4  "2008-03",..ect
     5 ];
     6 let figures = [
     7  0,
     8  0.555,
     9  0.293,..ect
    10 ]

    想要这样的结果

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

    方案一

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

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

    方案二

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

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

    方案三

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

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

    方案四

     1 const isEmpty = xs => xs.length === 0;
     2 const head = ([x,...xs]) => x;
     3 const tail = ([x,...xs]) => xs; 
     4 const map = (f, ...xxs) => {
     5   let loop = (acc, xxs) => {
     6     if (xxs.some(isEmpty))
     7       return acc;
     8     else
     9       return loop([...acc, f(...xxs.map(head))], xxs.map(tail));
    10   };
    11   return loop([], xxs);
    12 }
    13 let result = map((date, data) => ({date, data}), metrodates, figures);

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

  • 相关阅读:
    hdu2846 Repository
    Ajax:js自执行函数、jsonp、cros
    python读写Excel文件--使用xlrd模块读取,xlwt模块写入
    CentOS上快速安装saltstack
    Django_Form表单补充
    前端基础之Bootstrap介绍
    前端基础之jquery练习
    前端基础之Http协议
    Django_随机验证码
    dpkg --add-architecture i386 && apt-get update && > apt-get install wine32
  • 原文地址:https://www.cnblogs.com/guanghe/p/11445426.html
Copyright © 2011-2022 走看看