nodejs通过lodash合并去重由unixtime和Date组成的多少个数组

真心真意的只是全人类的欲念,但人类只是生活在记念里

Ford-《西部世界》剧照

负有的人都期待可以看透外人的魂魄,所有的人都梦想可以看出客人的难言之隐,因为人们更乐于相信自己眼睛看到的事物,这可以让他以为他见到的是实事求是。

影视著作满意了这样一种欲望。

而是世界没有实际过,无论人类的历史,还是科技的将来。

互联网渐渐将人类拉近虚拟的娱乐世界,在娱乐世界里,人们得以实施欲望的实事求是。

3D打印技术,各样人类感知转化为信息符号,通过数量程序创设了已经持有分析格局的人为智能,七情六欲趋于一体化的时候,记忆成为了富有智能文明的来自。

人类一贯都只好生活在记忆里,至于以后,只是一种冥想,虽然有相对种预防死亡的章程和技术,但死亡只是一种记念,未来并不设有,未来是一种倘若。

韩剧分外从容想象力,在人类所认同的现实性世界里,想象力为美利坚合众国人的生存打开了空中,他们发掘回想的深度,反向假若,将存于自然界中最为的规律举办打通,将技能变成艺术。

《西部世界》的发端体现了“人造人”技术的复杂性,机械手和3D打印技术将皮肤的集体打印出来,一种勾勒的笔法完全就像是绘画大师的笔,只是更细微,更规范;又如雕刻大师的雕刀,只是更精准,更了解。一具生命的皮囊下,装入五脏六腑,接入血液很神经,植入思维程序,输入七情六欲,加上整个都可能的偶尔,“人造人”和人里面的差距还有多少距离吗?

《西部世界》剧照

那直接是像“刘辉”这样的一般性人类的焦虑,他期待“人造人”可以和人类一样发展,但又不愿意“人造人”进化成人类这样的难以探究。

人类是不是间接在为协调打井坟墓?或是寻早一种灭亡的门径?每一种杀伤性武器的降生都是为了杀戮而暴发的,而每一场杀戮的历史都是以生命数量的削减为代价;每两次大战的名义都是不分互相,每一场正义的刀兵背后都是屠杀,那到底是全人类的本身救赎依旧自己毁灭?

在强硬的自然面前,人类向自然和协调的大脑无停歇低索取,而再无一点避讳,所谓地为了明日事实上只是为了前几天的团结,这种贪婪永无止境。

伯纳尔德(Bernard)的外甥死于游泳是发出的奇怪,他心平气和的皮囊下,藏着一颗隐忍的心,他的切肤之痛——就算他深信这是想拿到的事故,但她仍会内疚——在她自己的皮囊之下,如若大胆地臆想,他打造了两个弗洛丽丝的目标,一定是想通过实验来证实自己可以制作或是复活自己的男女。他为弗洛丽丝植入回想程序,并由此与她联系磨练,来不断地测试弗洛丽丝的情愫升华历程。他送礼物给弗洛丽丝,让弗洛丽丝读书吸取知识,甚至付诸弗洛丽丝一些社交技巧。

事实上这是一个诙谐的音信,相信《西部世界》的导演并不想让这部局完全具备逻辑,而是更多地同情于点燃人类对自我命局的反思。记得有人论述人类世界的这一次文明是“爱”的文武,那么实际上在“爱”这一空洞的人类关系中的文明象征人类自身的救赎在于人类爱的能力;在现代人爱的语境中,爱具有这各类内涵和外延。在《西部世界》前三集,大家能见到爱除了弗洛丽丝与泰迪之间的爱恋,以及弗洛丽丝对五叔的爱,再能感受到的就是Bernard藏得要命深的父爱。爱极为错综复杂的——弗洛丽丝因为记忆的发展,起初可以感受到记忆带来的宏伟痛苦,爱情和此外的爱混杂在里头,让弗洛丽丝几乎不能经受,但即便Bernard代表期望帮衬他清除这多少个记念或截止这所有,但弗洛丽丝却并不同意。通过回想,弗洛丽丝的激情发展速度很是之快,她起来有了憎恨、学习、忍耐……最后的嬗变,让弗洛丽丝举起了手枪,在缠绵悱恻的记念的驱动下,杀死了来犯的此外接待员。

当三回又两遍重置和修补的弗洛丽丝伴随着痛苦与爱的不止向上,泰迪的每两遍也都在提升,当观众可以领会泰迪也是一个“接待员”时,他们好像每一趟一样的故事情节里,爱情两次次地来袭,当弗洛丽丝亲吻泰迪的时候,现实与故事的歪曲出现了圆满的程度,弗洛丽丝在爱情低效率下,已经完结了心境的提升,成为了一个拥有感心理觉能力的智能机器人。

一致通过痛苦觉醒的还有妓院的老鸨。

重新一句前文的口舌——我们生存的社会风气,是由许三个错误构成的;每个人的一世,也是由众多少个谬误组成的。

《西部世界》剧照

老鸨因为工作人士的失误操作在被修复的时候醒来,在仅有的痛苦记念中,被开膛破肚的他逃离了“手术台”,实施修复的“医务卫生人员”被吓得心慌,老鸨迷失在炮制了娱乐世界的社会风气里,她没来得及寻找到这几个实际世界的说话,就被巨大守候修复重置的“尸体”吓晕,但她却由此在回忆中留下了“医生”和泰迪的映像,痛苦的记得让老鸨起头沉入痛苦的合计,她奋力想在温馨生活的世界中想起起“医务卫生人员“的印象,痛苦与仇恨让他陷入迷失,再后来,她挑选了杀手嫖客来剖开自己的肚皮,在血腥的提神中,她发觉了协调的不死之谜。

人类实际一贯活在大团结的记念里。记念的歪曲令人深陷痛苦的迷途,倘使没有回忆,人类的情愫一直无从谈起。

爱是起点于痛苦的记得的,痛苦的记得源于各类罪恶带来的害怕与孤独感,人类为了躲开恐怖与孤单,又会再次回到记忆里寻求救赎,人类经过千百年的查找,发现了拜托痛苦的各样途径——权力、财富、游戏、毒品、痛苦、死亡以及爱,不过人在这一个采纳面前依旧麻木而不快,所以采取成了新的伤痛。

痛苦与爱是相伴相生的,没有一种爱不分包着痛苦。痛苦是的来源,爱是悲苦的救赎。爱的雍容悠久,自由的痴情成为了最有价值的文明礼貌,她带着人类抱有的劣根性走在向阳解脱的中途。

只要人类尚未那么多欲望,他们恐怕能够像蟑螂和蚂蚁一样更久地存在与这么些星球。人类的科技更像黑夜中一场绚丽的焰火表演,烟火的能量燃尽,绚丽归于寂灭。

人类的基因重来没有忘记杀戮和和情欲,甚至是一种百折不挠。我相信基因还有温馨的基因,人类没有到达的微观边界,我们生命的起源即是历史的长度也是空中的维度。

随便任何一个中华民族仍然国家的人,人们只是在强力面前临时止步,也许是恐惧了武器的毁灭性,也许是止步于随着人口增长的死亡的面积的畏惧,也许是社会风气饥饿的缩减,但暴力与屠杀时刻都是幽灵。

《西部世界》也好,其他的泰剧也好,对于肉欲的形容极力渲染,又落向真正。日剧在性欲的勾勒上回归了人性本身,既有对性格的抒写,又有对血肉之躯的夸赞,在此时的编剧、导演、演员、观众之间恰恰是一场人性的并行:编剧希望真正地记录这么些世界的罪恶与美,同时满意自己的合作与精神欲求,导演力图真实地再现那一个世界的秉性与贪婪、罪恶与美,来落实各类优质,演员在剧中可以兑现现实中不可能落实的高尚与罪恶,观众希望观望世界真实性的罪恶与美,感受到祥和的试听带自己进入自由的狂野,亲历犯罪与占用的快感,但具有的人都在偷看外人的心灵和隐私,实际上真正的通晓就是看看了真格的的友好。

世界本身就是全人类自己制作的剧院,有时你是观众,有时你是艺人。西部世界是剧场中的游戏场,游戏中的游戏还原了人类本性的基因甚至是基因的基因,权力、财富、游戏、毒品、痛苦、死亡那个奇迹和一定,滋生着罪恶与美,让生命不止地感受痛苦,不断地到底而有萌生希望,寻求救赎。

“何人都不能够妨碍我们的顾客烧杀抢劫,奸淫掳掠。”这是来到西部世界的各类欲望。这种服务思维的暗中是“消费者就是上帝!”的见识吗?彰着不是,这是金钱浴权力媾和发生的欲望支配,是欲望本身的腾飞,人们接纳在娱乐中感受自己变成恶人的快感,绝大多数人,就是为着杀戮和人事而来。

大家必须说,人类在山清水秀社会里压抑着原始欲望的生长,我们也非得说,纯粹的任性就是心有余而力不足无天。尚未人是先天性的善者,也并未人是先天性的地痞。善恶是人类在这多少个时空里的“色彩”符号,道德只是一种颜色,人类文明的水彩。葡京游戏网址,山清水秀并非是一个有情义色彩的词汇,文明只是人类的工具,或执政,或前行,也许如车轮,也许如鞭子。

韩剧很残忍,因为美利哥人的野史从未那么久,日剧很实际,但那只是感到,英剧奉行了诚实的展现和用实际来诱惑人类对于文明的认识。但这种文明,迟早有一天,会趁着人类过去,而被另一种文明所代替,也许是地球上的另一个物种,但更大的恐怕就是人类自己制作的人工智能,那正好就是信息自身的进化或是科技我的进化发展的自然——自然本身。

时间具有大海一样的力量,可以让一切尖锐的,原始的,形状不一的业务变成碎末、变成虚无,或归于尘土。但时间并不存在,时间是人类自己对于生命方向的感知,后来的文武可能没有时间的维度,而只是消息或能量的轮回。

“人法地,地法天,道法自然”其中的“道法自然”的确是一句令人可以可信的解说,“人法地、地法天”在最近的认识中就很难让人悟出合理来,人是会向土地探索和上学,但不用完全“法地”,地法天”看来只是一种笼统的回味,但道法自然这一句因该够了,以现代科学的思想观念来看,道就是是规律,是宇宙进化的端倪。

实在的艺术著作却期待可以有一种超过,越是有法子天赋的人,越容易相信真正是一个相持的概念。

“整个社会风气都是一个魔术,除了魔术师本人”这是福特(Ford)的一句台词,假诺单看Ford的脸,几乎满脸的慈爱与睿智,但Ford更确信他协调的认知,他让抱有创建者相信,“人造人”是不会感到到冷的,也不会感到到羞耻——他相信左右整整西部世界游乐的精通者,他可以支配总体。所有人造人的留存就是她的魔术,在一个魔术师的眼里,他有所相对的权杖,他可以擅自。

在《西部世界》里,Ford是一个自己实现者。他操控权力、科技、甚至认为能够操控人的精神和进化。但他又是一个彻头彻尾的现实主义者,他紧紧低抓住权力,专制而发狂地形成自身的奇想,他远不同于原始的拍档——Arnold,阿诺德(Arnold)醉心于自己的创始与钻探,他更像一个颇具创立力的神,或是极力专注于极端边缘的音乐家,他依然用生命书写了发现最终的信息,用生命的一去不复返来证实生命或生命信息通过意识的本人繁殖。

西方世界吊足了观众的饭量,恰恰是引发了脾气本身,抓住了道德悖论,抓住了心灵的罪恶与贪婪,却最后会设置一个反省的谈话,也是救赎的发话——这就是爱。

《西部世界》剧照

网络游戏正逐渐低统治了人类的时刻,在玩耍里你是一个玩家,有趣的是,在戏耍设计者这里,你就是一个被决定的主角,而游戏公司的业主或董事长有时操纵有些设计者的,而经理更多的时候也会成灰另外一层的社会成员的玩偶……最后让大家来看的是全人类的思辨皮肤下,文明本身是罪大恶极,爱是这世界唯一的救赎之路。

但爱如此只稀少和宝贵,所以这世界注定了罪恶,注定了贪婪,注定了先前时期的正剧,日剧的私下是全人类对于我罪恶的心病,但实际上人类处理逃避惩罚外,正用超乎自然的手腕继续着罪恶,毕竟这罪恶从未真正低被验证,末日的惩治也未赶到。

1. 问题源于


如今在实现一个API,其中有一些效果是内需从Mongodb中取出一个由Date对象组成的数组,然后将客户端传过来的unixtime合并到该数组中,并且去重新。

譬如,假如从mongodb中取回来的数据中有一个号称gaming的项,专门用来记录用户进入娱乐的起头时间和退出时间。
那么mongoose的schema的概念将大约是这样的:

const DeviceLogSchema = new Schema({
 ...
  gaming: [{ enter: Date, exit: Date, _id: false }],          
 ... 
});

而从mongodb取回来的数据大约就是以此样子的:

{
"gaming": [
      {
        "enter": 2017-04-25T14:32:12.081Z,
        "exit": 2017-04-25T14:48:52.082Z,
      },
      {
        "enter": 2017-04-26T14:32:12.081Z,
        "exit": 2017-04-26T14:48:52.082Z,
      }
    ],
}

也就是说通过mongoose的model取回来的笔录中,enter和exit都是Date(对mongodb来说)类型的,而对此js来说,就是一个Object(js将具备简单类型以外的数据类型都处理成Object)。

let deviceLog = await DeviceLog.findOne({});
console.log(typeof deviceLog.enter) // ->Object

而客户端每隔一段时间就会调用api来将新的用户游戏时间回传给服务器,但用的格式是unixtime。

{
    "gaming": [{
      "enter": 1493130733081,
      "exit": 1493131734082,
    },{
      "enter": 1493130735084,
      "exit": 1493131736087,
    }],
}

此地的enter和exit的unixtime时间格式,对于js来说,就是number类型的。

我们经过mongoose来保存的时候,不需要将unixtime举行另外转换,直接保存,
mongoose会将其自行转成Date格式进行保存。也就是说,倘诺保留前的gaming内容是之类这一个样子的:

"gaming": [
      {
        "enter": 2017-04-25T14:32:12.081Z,
        "exit": 2017-04-25T14:48:52.082Z,
      },
      {
        "enter": 2017-04-26T14:32:12.081Z,
        "exit": 2017-04-26T14:48:52.082Z,
      },
      {
        "enter": 1493130733081,
        "exit": 1493131734082,
      },
      {
        "enter": 1493130735084,
        "exit": 1493131736087,
      }
    ],

那么通过mongoose的model保存之后,最后会自行成为近乎以下这样的格式:

"gaming": [
      {
        "enter": 2017-04-25T14:32:12.081Z,
        "exit": 2017-04-25T14:48:52.082Z,
      },
      {
        "enter": 2017-04-26T14:32:12.081Z,
        "exit": 2017-04-26T14:48:52.082Z,
      },
      {
        "enter": 2017-04-27T14:22:12.021Z,
        "exit": 2017-04-27T15:32:12.031Z,
      },
      {
        "enter": 2017-04-26T16:22:12.082Z,
        "exit": 2017-04-26T16:52:12.082Z,
      }
    ],

那么这里要缓解的问题就是:

  • 什么将客户端传过来的新数组和从mongodb取回来的数组举行联合
  • 统一时怎么依据游戏进入的时间enter来去重复

本来,我们可以用原始的法门,做两层遍历,分别便利五个不等的数组,然后将中间一个比对数据的类型转换成此外一个数量对应的序列,然后开展相比其是否等于,相等的话就去掉,不想等的话就将数据追加到数组中。

但,那样成效太低了,应该有更好的更优雅的主意来赞助大家处理这种题材。

2. 试验数据

那么我们就依据地点碰着的题目,来树立五个实验所用的数量。一个是意味从mongodb取回来的数目:

const orgGaming = [
      {
        "enter": new Date("2017-04-25T14:32:12.081Z"),
        "exit": new Date("2017-04-25T14:48:52.082Z"),
      },
      {
        "enter": new Date("2017-04-26T14:32:12.081Z"),
        "exit": new Date("2017-04-26T14:48:52.082Z"),
      }
]

一个是客户端传进来的数额:

const newGaming = [
     {
        "enter": 1493130732081, // 这和orgGamine第一条数据重复
        "exit": 1493131732082, // 这和orgGamine第一条数据重复
      },
      {
        "enter": 1493130735084,
        "exit": 1493131736087,
      }
    ]

新数组中的第一条数据和enter和数据库中的第一条数据的enter,事实上是一样的,所以我们愿意统一之后这一个重复数据是去掉的。

3. ES6数结缘并新特色


实则,假使不是因为要考虑去重新的题目来说,我们一齐可以因而ES6的新特征来完成的。

array1.push(...array2)

此处的’…’操作符叫做扩展运算符,是ES6引入的新特征。目标是将一个数组打散成用逗号分隔的参数体系。

const array = [1, 2];
console.log(...array); // 相当于 console.log(1,2)

因而地方的示范代码的意趣就是将array2打散后,将各种元素作为参数push到array1中变化新的数组。所以,即便选用到我们的面貌中的话

const orgGaming = [
      {
        "enter": new Date("2017-04-25T14:32:12.081Z"),
        "exit": new Date("2017-04-25T14:48:52.082Z"),
      },
      {
        "enter": new Date("2017-04-26T14:32:12.081Z"),
        "exit": new Date("2017-04-26T14:48:52.082Z"),
      }
]

const newGaming = [
     {
        "enter": 1493130732081,
        "exit": 1493131732082,
      },
      {
        "enter": 1493130735084,
        "exit": 1493131736087,
      }
]

orgGaming.push(...newGaming);
console.log(orgGaming);

最终将会输出没有去重新的结果:

[ 
  { enter: 2017-04-25T14:32:12.081Z,
    exit: 2017-04-25T14:48:52.082Z },
  { enter: 2017-04-26T14:32:12.081Z,
    exit: 2017-04-26T14:48:52.082Z },
  { enter: 1493130732081, 
    exit: 1493131732082 },
  { enter: 1493130735084, 
    exit: 1493131736087 } 
]

当然,ES6的这些数组合并形式还足以如此写:

[...array1,...array2]

还要,ES6还提供了对简易数据类型去重新情势:

[...new Set([...array1 ,...array2])];

不过,那一个只好针对简单数据类型进行去重新,比如数字类型和字串类型等。

const array1 = ['techgogogo', 'sina', 'baidu'];
const array2 = ['techgogogo', 'google'];
console.log([... new Set([...array1, ...array2])]);

末尾输出:

[ 'techgogogo', 'sina', 'baidu', 'google' ]

只是对于咱们这里的目标类型组成的数组,它是做不到的。

最重点的是,它没有提供一个comparator的回调方法来放我们处理相应怎么样判断,多少个数据是否是重复的。

此间,lodash的数组操作,也许是个科学的缓解方案(之一)。

4. lodash统一对象类型数组并去重新

lodash的unionWith格局可以统一四个数组,并且可以让我们提供一个comparator方法来决定该怎么相比较五个数组中的元素是否是一致的,以此来判定这些数量是否是重复的。

官方文档对unionWith方法的描述请看这里:https://lodash.com/docs/4.17.4\#unionWith

_.unionWith([arrays], [comparator])

清楚起来也相比简单,请看代码如下:

const _ = require('lodash');
const orgGaming = [
      {
        "enter": new Date("2017-04-25T14:32:12.081Z"),
        "exit": new Date("2017-04-25T14:48:52.082Z"),
      },
      {
        "enter": new Date("2017-04-26T14:32:12.081Z"),
        "exit": new Date("2017-04-26T14:48:52.082Z"),
      }
]

const newGaming = [
     {
        "enter": 1493130732081,
        "exit": 1493131732082,
      },
      {
        "enter": 1493130735084,
        "exit": 1493131736087,
      }
]

gaming = _.unionWith(orgGaming, newGaming, (value1, value2) => {
    if (typeof value1.enter === 'number' && typeof value2.enter === 'number') {
        return (value1.enter === value2.enter);
    } else if (typeof value1.enter === 'number' && typeof value2.enter === 'object') {
        return (value1.enter === value2.enter.getTime());
    } else if (typeof value1.enter === 'object' && typeof value2.enter === 'number') {
        return (value1.enter.getTime() === value2.enter);
    } else if (typeof value1.enter === 'object' && typeof value2.enter === 'object') {
        return (value1.enter.getTime() === value2.enter.getTime());
    }
});

console.log(gaming);

这边首要的地点就是uionWith,有多少个地方需要留意:

  • 参数的依次,特别是前六个数组参数。就算第一个数组中某个成员判定和第二个数组中的某个成员是再次的,那么首先个数组中的该因素会保留,第二个数组中的对应元素会移除。
  • 其多少个参数就是一个回调方法,接受五个参数,其实就是六个需要比对的数组的成员,这里我们经过比对五个分子的enter是否等于来判断该成员是否再度。
  • 判定是否再一次的时候,咱们需要将日志先转换成unixtime的格式,然后再举行相比较。

末尾我们可以观察去重新后的出口:

[ { enter: 2017-04-25T14:32:12.081Z,
    exit: 2017-04-25T14:48:52.082Z },
  { enter: 2017-04-26T14:32:12.081Z,
    exit: 2017-04-26T14:48:52.082Z },
  { enter: 1493130735084, 
    exit: 1493131736087 } ]

可以看到,最后输出的列表中只有几个对象,其中一个重复的早已被丢掉掉了。

最终大家因此mongoose将那份数据存储到mongodb时,如前方所述,会自动将unixtime转换成Date进行仓储,这样数据就联合起来了。这里mongoose的操作就不赘述了,有趣味的对象可以友善执行下。

上述就是自家对五个由对象类型组成的数组举行合并的局部尝试和举办,假诺大家有更好更优雅的形式的话,欢迎在评论中给出去。先拜谢了!

本文由世界会常德分舵编写,转载需授权,喜欢点个赞,吐槽请评论,进一步互换请关注群众号techgogogo或者直接关系我微信zhubaitian1