用lodash删除重复项 [英] removing duplicates with lodash

查看:940
本文介绍了用lodash删除重复项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下数组:

data = [{
  name: "Robert",
  urls: [{
    provider: "facebook",
    url: "http://twitter.com/rob"
  }]
}, {
  name: "Robert",
  urls: [{
    provider: "youtube",
    url: "http://youtube.com/robs"
  }]
}, {
  name: "Linda is a perfect duplicate",
  urls: [{
    provider: "youtube",
    url: "http://youtube.com/lindaTube"
  }]
}, {
  name: "Linda is a perfect duplicate",
  urls: [{
    provider: "youtube",
    url: "http://youtube.com/lindaTube"
  }]
}]

我需要基于data构建一个看起来像这样的新数组:

I need to build a new array based on data that look like this one:

newdata = [{
  name: "Robert",
  urls: [{
    provider: "facebook",
    url: "http://twitter.com/rob"
  }, {
    provider: "youtube",
    url: "http://youtube.com/robs"
  }]
}, {
  name: "Linda is a perfect duplicate",
  urls: [{
    provider: "youtube",
    url: "http://youtube.com/lindaTube"
  }]
}];

我正在使用.merge.keyBy,但是[urls]始终被覆盖.
这是我的方法:

i'm using .merge and .keyBy but [urls] is always overwritten.
here is how i do it:

let newdata = [];
data.forEach((val, i) => {
  newdata = _.values(_.merge(
            _.keyBy(newdata, 'name'),
            _.keyBy(data[i], 'name')
            ));
});

推荐答案

您可以使用 ,将集合按name分组.使用 lodash#map 将组重建为数组.使用 lodash#flatMap 将所有网址转换为扁平格式,因此我们可以删除所有网址通过 lodash#uniqWith 具有

You can use lodash#groupBy to group the collection by name. Rebuild the group into an array using lodash#map. Use lodash#flatMap to obtain all urls into a flattened format, so we can remove all the duplicates through lodash#uniqWith that has a lodash#isEqual comparator function.

var result = _(data)
  .groupBy('name')
  .map((group, name) => ({
    name,
    urls: _(group).flatMap('urls').uniqWith(_.isEqual).value()
  }))
  .value();

var data = [{
  name: "Robert",
  urls: [{
    provider: "facebook",
    url: "http://twitter.com/rob"
  }]
}, {
  name: "Robert",
  urls: [{
    provider: "youtube",
    url: "http://youtube.com/robs"
  }]
}, {
  name: "Linda is a perfect duplicate",
  urls: [{
    provider: "youtube",
    url: "http://youtube.com/lindaTube"
  }]
}, {
  name: "Linda is a perfect duplicate",
  urls: [{
    provider: "youtube",
    url: "http://youtube.com/lindaTube"
  }]
}];

var result = _(data)
  .groupBy('name')
  .map((group, name) => ({
    name,
    urls: _(group).flatMap('urls').uniqWith(_.isEqual).value()
  }))
  .value();
  
console.log(result);

.as-console-wrapper{min-height:100%;top:0}

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

<!--
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>
-->

这篇关于用lodash删除重复项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆