数组的flatten

码上飞
• 阅读 3337

微博上看到有人说手工实现个_.flatten(将[1,[2,[2,1]],2]变为[1,2,2,1,2])就可以给他发简历了,发简历没什么兴趣,倒是可以试着实现一个。想了想其实这个不难,我的实现如下:

var flatten = function(arr) {
    var index = arguments[1] || 0;
    var destArr = arr.slice(0, index).concat(arr[index]).concat(arr.slice(index + 1));
    return index === arr.length ? arr: arguments.callee(destArr, ++index);
}

原理就是对数组进行concat生成新的数组,concat的时候可以减少数组的维数。后面看了微博上其他人的实现,顿时觉得自己好2。直接concat就行了,下面是别人的实现:

Array.prototype.flatten = function() {
    var flattened = Array.prototype.concat.apply([], this);
    if (flattened.length == this.length) return flattened;
    else return flattened.flatten();
}

附上underscore的_.flatten

_.flatten = function(array, shallow) {
    // 迭代数组中的每一个元素, 并将返回值作为demo传递给下一次迭代
    return _.reduce(array, function(memo, value) {
        // 如果元素依然是一个数组, 进行以下判断:
        // - 如果不进行深层合并, 则使用Array.prototype.concat将当前数组和之前的数据进行连接
        // - 如果支持深层合并, 则迭代调用flatten方法, 直到底层元素不再是数组类型
        if(_.isArray(value))
            return memo.concat( shallow ? value : _.flatten(value));
        // 数据(value)已经处于底层, 不再是数组类型, 则将数据合并到memo中并返回
        memo[memo.length] = value;
        return memo;
    }, []);
};

点赞
收藏
评论区
推荐文章
Jack Jack
4年前
用代码制作QQ消息轰炸
今天教大家怎么制作给QQ好友发消息可以达到轰炸的效果。实现恶搞好友的效果,例如给他发一个中病毒的轰炸信息,“你的手机已中病毒!!!请关机重启!!!”,“你的手机已中病毒!!!请关机重启!!!”哈哈哈,看看你的好友啥反应吧,平时也可以搞着玩,例如你的女朋友让你说一万句“我爱你”,你就可以使用此方法给她来个信息轰炸。信息内容,轰炸次数
凯特林 凯特林
4年前
JS - 用 for 循环实现常见的数组迭代方法
常见的数组迭代方法有很多种,比如some,filter,map等等,底层也都可以用for来实现,我们来康一康。somejsconstsome(arr,fn)for(leti0;i<arr.length;i)if(fn(arri,i,arr))re
liam liam
3年前
有了这个云端Mock功能,你的简历起码提升30分!
前言我发现一个现象很久了:很多人都喜欢私下自己做一些项目。也就是一些个人的项目,其实我觉得这样挺好处挺多的:1、可以在空闲时间提升自己的技术2、这些个人项目可以写在简历上,为自己加分大家都有这样的疑问问:三哥啊,我觉得自己私下里写的项目真的鸡肋啊,食之无味,弃之可惜我:为啥这么说呢?问:写到简历上,怕面试官觉得low,不写到简历上,又觉得也还行,
Wesley13 Wesley13
3年前
UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)
0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We
Wesley13 Wesley13
3年前
5分钟谈前端面试
鉴于经常性有人私聊问我一些关于前端面试的问题,很多时候我比较忙就没回复,然后事后又忘记回复了。借助这篇文章,我做个总结,大家大概花个5分钟就能整体看完。一、个人简历一个人的简历对他找工作到底有多重要呢?🤔可以说这是一块敲门砖,一份漂亮的简历不但可以为了获取一个面试机会,还能增加公司对你的好感。在只能通过你简历去了解你的情况下,你的简
Wesley13 Wesley13
3年前
Valine评论系统邮件提醒
这几天想到,别人给我发的评论,我还要到后台去看,实在是太麻烦了,于是发现了一个好项目valineadmin可以帮我发送邮件评论提醒,这样我就可以实时收到别人给我发的评论。!image(https://oscimg.oschina.net/oscnet/5940a6f5b07c26046b2c2fa0e9b40e56249.png)<btnce
Stella981 Stella981
3年前
Hibernate纯sql查询结果和该sql在数据库直接查询结果不一致
问题:今天在做一个查询的时候发现一个问题,我先在数据库实现了我需要的sql,然后我在代码中代码:selectdistinctd.id,d.name,COALESCE(c.count_num,0),COALESCE(c.count_fix,0),COALESCE(c
Wesley13 Wesley13
3年前
5种方式实现数组扁平化
数组扁平化概念数组扁平化是指将一个多维数组变为一维数组1,2,3,4,51,2,3,4,5实现1\.reduce遍历数组每一项,若值为数组则递归遍历,否则concat。functionflatten(arr){
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
京东云开发者 京东云开发者
11个月前
京东短网址高可用提升最佳实践
什么是短网址?短网址,是在长度上比较短的网址。简单来说就是帮您把冗长的URL地址缩短成8个字符以内的短网址。当我们在腾讯、新浪发微博时,有时发很长的网址连接,但由于微博只限制140个字,所以微博就自动把您发的长网址给转换成短网址了。在微博和手机短信提醒等限
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(