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