У меня есть следующий массив:
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#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>
-->
Как насчет этого?
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>