удаление дубликатов с помощью lodash

1

У меня есть следующий массив:

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 которые выглядят следующим образом:

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] .keyBy [urls] всегда перезаписывается.
вот как я это делаю:

let newdata = [];
data.forEach((val, i) => {
  newdata = _.values(_.merge(
            _.keyBy(newdata, 'name'),
            _.keyBy(data[i], 'name')
            ));
});
Теги:
lodash

2 ответа

1

Вы можете использовать lodash#groupBy для группировки коллекции по name. Перестройте группу в массив, используя lodash#map. Используйте lodash#flatMap чтобы получить все URL-адреса в сплющенный формат, поэтому мы можем удалить все дубликаты с помощью lodash#uniqWith с lodash#isEqual.

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

Как насчет этого?

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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню