数组及对象实用方法总结

在项目中经常需要处理数据,经常需要操作数组和对象, 且正确使用reduce能够节省很多不必要的代码

1. 造假数据,例如数组

1.1 使用repeat方法:

'abc'.repeat(3).split('')
// ["a", "b", "c", "a", "b", "c", "a", "b", "c"]

1.2 使用fill方法:

Array(5).fill('abc')
// ["abc", "abc", "abc", "abc", "abc"]
2. 统计数组中相同项出现的次数:
const arr = ['mo', 'melantha', 'mo', 'nian', 'chen', 'melantha'];

const nameArr = arr.reduce((prev, name) => {
    prev[name]  = prev[name] ? ++prev[name] : 1;
    return prev
}, {});
//  {mo: 2, melantha: 2, nian: 1, chen: 1}
3. 把数组中按相同元素归类: eg: 把dateArr数组中的日期,出现在同一天的进行归类
const dateArr = [
    {
        date: '2019-06-12',
        count: 5
    },
    {
        date: '2019-06-13',
        count: 4
    },
    {
        date: '2019-05-12',
        count: 3
    },
    {
        date: '2019-06-12',
        count: 8
    },
    {
        date: '2019-06-13',
        count: 9
    },
    {
        date: '2019-04-12',
        count: 1
    },
];

const  dateObj = dateArr.reduce((prev, item) => {
    if (prev[item.date]) {
        prev[item.date].push(item)
    } else {
        prev[item.date] = [item]
    }
    return prev
}, {});
image.png
4. 将多维数组平铺到一维数组
const flatten = (arr) => {
   const result = arr.reduce((prev, item) => {
      if(Array.isArray(item)) {
        return prev.concat(flatten(item))
    } else {
        return prev.concat(item)
    }
   }, [])
  return result;
}
flatten(['a',  [1,2,3, ['c', [9, [3], 10],'k']], ['4', '7']]);
// ["a", 1, 2, 3, "c", 9, 3, 10, "k", "4", "7"]
5. 将多维数组平铺到指定深度
const flatten = (arr, depth = 1) => {
    if ( depth !== 1) {
        const value1 = arr.reduce((prev, item) => {
        if(Array.isArray(item)) {
          return prev.concat(flatten(item, depth - 1));
       } else {
          return prev.concat(item);
      }
    } ,[]);
    return value1;
    } else {
    const value2 = arr.reduce((prev, item) => {
        return prev.concat(item)
    }, []);
    return value2;
  }
}
flatten(['a',  [1,2,3, ['c', [9, [3], 10],'k']], ['4', '7']], 4)
// ["a", 1, 2, 3, "c", 9, 3, 10, "k", "4", "7"]
flatten(['a',  [1,2,3, ['c', [9, [3], 10],'k']], ['4', '7']], 2)
//  ["a", 1, 2, 3, "c", [9, [3], 10] , "k", "4", "7"]
6. 将一位数组转为二维数组

一维数组数据:


一维数组.png

二维数组结果数据:


二维数组.png

方法一:splice效率极低,每次splice操作除了需要分配新的内存区域去存储数据外,还需要不断操作元素的下标,大量移动元素,如下start为0,就需要每个元素都移动一次
参考:https://segmentfault.com/a/1190000020711978

 const returnArr = (arrs: any, num = 3) => {
    console.time('数据cameraListDatacameraListData');
    const list = _.cloneDeep(arrs);
    const result = [];
    while (list.length > 0) {
      result.push(list.splice(0, num));
    }
    console.timeEnd('数据cameraListDatacameraListData');
    return result;
  };

耗时: 1901.871826171875 ms

方法二:slice

 const returnArr = (arrs: any, num = 3) => {
    console.time('数据cameraListDatacameraListData');
    const list = _.cloneDeep(arrs);
    const result: any = [];
    let linNum =
      list.length % num === 0
        ? list.length / num
        : Math.floor(list.length / num + 1);
    for (let i = 0; i < linNum; i++) {
      let temp = arrs.slice(i * num, (i + 1) * num);
      result.push(temp);
    }
    console.timeEnd('数据cameraListDatacameraListData');
    return result;
  };

耗时: 172.5029296875 ms

方法三:

 const returnArr = (arrs: any, num = 3) => {
   console.time('数据cameraListDatacameraListData');
    var result: any = [];
    for (var i = 0, j = 0; i < arrs.length; i += n) {
      result[j] = [];
      for (var k = 0; k < n; k++) {
        if (i + k < arrs.length) {
          result[j].push(arrs[i + k]);
        }
      }
      j++;
    }
    console.timeEnd('数据cameraListDatacameraListData');
    return result;
  };

耗时: 5.12890625 ms

方法四:

 const returnArr = (arrs: any, num = 3) => {
   console.time('数据cameraListDatacameraListData');
    const result: any = [];
    arrs.forEach((item: any, index: any) => {
      const linNum = Math.floor(index / num); // 计算该元素为第几个数组内
      if (!result[linNum]) {
        // 判断是否存在
        result[linNum] = [];
      }
      result[linNum].push(item);
    });

    console.timeEnd('数据cameraListDatacameraListData');
    return result;
  };

耗时: 4.59814453125 ms

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • # 数组部分 # 1.## array_chunk($arr, $size [, $preserve_key = ...
    clothTiger阅读 1,172评论 0 1
  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,124评论 0 18
  • 转载:在开发中,数组的使用场景非常多,平日中也涉及到很多数组的api/相关操作,一直也没有对这块内容进行一块整理总...
    七色烟火阅读 3,219评论 0 3
  • NumPy是Python中关于科学计算的一个类库,在这里简单介绍一下。 来源:https://docs.scipy...
    灰太狼_black阅读 1,228评论 0 5
  • 先决条件 在阅读这个教程之前,你多少需要知道点python。如果你想从新回忆下,请看看Python Tutoria...
    舒map阅读 2,577评论 1 13