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);

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

  • 相关阅读:
    php实现rpc简单的方法
    统计代码量
    laravel的速查表
    header的参数不能带下划线
    PHP简单实现单点登录功能示例
    phpStorm函数注释的设置
    数据结构基础
    laravel生命周期和核心思想
    深入理解php底层:php生命周期
    Jmeter:实例(性能测试目标)
  • 原文地址:https://www.cnblogs.com/guanghe/p/11445426.html
Copyright © 2011-2022 走看看