removing duplicates with lodash

独自空忆成欢 提交于 2019-12-13 18:32:20

问题


I've got the following array:

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"
  }]
}]

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"
  }]
}];

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')
            ));
});

回答1:


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>
-->



回答2:


How about it?

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 newdata = _.reduce(data, (result, value) => 
  _.values(
    _.mergeWith(
      _.keyBy(result, 'name'), 
      _.keyBy([value], 'name'), 
      (obj, src) => 
        _.isArray(obj) ? 
          _.values(_.merge(_.keyBy(obj, 'provider'), _.keyBy(src, 'provider'))) : 
          undefined   
    )
  ), []
);

console.log(newdata);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>


来源:https://stackoverflow.com/questions/46028895/removing-duplicates-with-lodash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!