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

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

  • 相关阅读:
    C#将List<T>转化为DataTable
    SqlServer常用内置函数
    C#索引器
    验证Textbox的字符长度
    WM消息对应的Message消息中的Lparam和WParam
    对窗体操作的WM消息
    DllImport使用
    C#获取当前路径的七种方法
    注册ActiveX控件
    [转]VS2010中水晶报表安装应用及实例
  • 原文地址:https://www.cnblogs.com/guanghe/p/11445426.html
Copyright © 2011-2022 走看看