您的位置:金沙手机版下载 > www.990.com > nodejs通过lodash合并去重由unixtime和Date组成的两个

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

2019-11-09 00:51

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的操作就不赘述了,有野趣的爱人能够自个儿施行下。

上述正是本身对四个由对象类型组成的数组实行合并的一部分尝试和举办,要是大家有越来越好更温婉的办法的话,迎接在人言啧啧中给出去。先拜谢了!

www.990.com,正文由世界会江门分舵编写,转发需授权,喜欢点个赞,捉弄请研商,进一层沟通请关切公众号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到array第11中学子成新的数组。所以,要是利用到我们的场景中的话

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的数组操作,可能是个不错的解决方案(之生机勃勃卡塔尔。

本文由金沙手机版下载发布于www.990.com,转载请注明出处:nodejs通过lodash合并去重由unixtime和Date组成的两个

关键词: