银河网投[网址]www.308877.com-官网首页

您的位置:银河网投 > 游戏试玩中心 > nodejs通过lodash合并去重由unixtime和Date组成的两个

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

2019-11-29 21:53

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依然直接挂钩本人Wechatzhubaitian1

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,事实上是同意气风发的,所以大家期望统一之后那些重复数据是去掉的。

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来去重复

当然,大家能够用原本的办法,做两层遍历,分别便利四个不等的数组,然后将里面叁个比对数据的类型转变到此外二个数额对应的类型,然后实行比较其是还是不是等于,相等的话就去掉,不想等的话就将数据追加到数组中。

但,那样效能太低了,应该有越来越好的更温婉的办法来提携大家管理这种主题材料。

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的数组操作,可能是个不利的解决方案(之大器晚成)。

本文由银河网投发布于游戏试玩中心,转载请注明出处:nodejs通过lodash合并去重由unixtime和Date组成的两个

关键词:

  • 上一篇:没有了
  • 下一篇:没有了