Given an array of objects, where a URL has an array of objects, each with an ID:
[
{
"url": "http://www.example.com/something",
"ids": [
{ "id": "U30", "type": "a11y-unknown" },
{ "id": "RC30", "type": "a11y-unknown" }
]
},
{
"url": "http://www.example.com/something-else",
"ids": [
{ "id": "U30", "type": "a11y-unknown" },
{ "id": "RC32", "type": "a11y-ready" }
]
}
]
I'm trying to loop over the array, then the array of ids
and grab the id (U30 for example) and organize the urls by ID.
The end result should look like:
{
"U30": {
"type": "a11y-unknown",
"urls": [
"http://www.example.com/something",
"http://www.example.com/something-else"
]
}
},
{
"RC30": {
"type": "a11y-ready",
"urls": [
"http://www.example.com/something"
]
}
},
{
"RC32": {
"type": "a11y-unknown",
"urls": [
"http://www.example.com/something-else"
]
}
}
I'm doing the following which gives me the URL's, but I can't get the associated id to be the key at the top, as well as the type
value as another property for each ID.
const output = {};
sites.forEach(obj => {
const ids = obj.ids
if (ids && ids.length > 0) {
ids.forEach(id => {
if (!output[id]) {
output[id] = {length: 0, urls: []}
}
output[id].urls.push(obj.url);
output[id].length ;
});
}
});
CodePudding user response:
const data = [
{
"url": "http://www.example.com/something",
"ids": [
{ "id": "U30", "type": "a11y-unknown" },
{ "id": "RC30", "type": "a11y-unknown" }
]
},
{
"url": "http://www.example.com/something-else",
"ids": [
{ "id": "U30", "type": "a11y-unknown" },
{ "id": "RC32", "type": "a11y-ready" }
]
}
]
const grouped = {}
for (const obj of data) {
for (const idObj of obj.ids) {
if (!grouped[idObj.id]) {
grouped[idObj.id] = {
urls: [],
type: idObj.type
}
}
grouped[idObj.id].urls.push(obj.url)
}
}
console.log(grouped)
CodePudding user response:
You could reduce the array by taking id
as key.
const
data = [{ url: "http://www.example.com/something", ids: [{ id: "U30", type: "a11y-unknown" }, { id: "RC30", type: "a11y-unknown" }] }, { url: "http://www.example.com/something-else", ids: [{ id: "U30", type: "a11y-unknown" },{ id: "RC32", type: "a11y-ready" }] }],
result = data.reduce((r, { url, ids }) => {
ids.forEach(({ id, type }) =>
(r[id] ??= { type, urls: [] }).urls.push(url)
);
return r;
}, {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }