Skip to content
Advertisement

How to remove duplicates by property of an object in an array of objects and copy all properties of duplicates?

I delete all duplicates by the “sourceType” property of the object in the array of objects, but I cannot copy the “dataType” property from the duplicates to the original, please check what I’ expecting in at output and expected output

const datasources = [ "sourceType2 /4 (Metric) Custom", "sourceType2 /4 (Datamap) Custom", "sourceType2 /4 (Event) Custom", "sourceType2 /4 (All) Custom", "sourceTYpe3 /4 (Metric) Custom", "sourceTYpe3 /4 (Datamap) Custom", "sourceTYpe3 /4 (Event) Custom" ]

function transformDataSources(datasource) {
    const transformation = datasource.map(str => ({
        sourceType: str.substr(0, str.indexOf("/")).split(" ").join(""),
        policyReferences: [{
        dataType: (str.match(/((.*))/).pop().split(" ").join(""))
        }]
    })).filter((item, index, array) => array.map(mapItem => mapItem.sourceType)
        .indexOf(item.sourceType) === index)
        console.log(transformation)
}

transformDataSources(datasources)

output:

[{
  policyReferences: [{
  dataType: "Metric"
}],
  sourceType: "sourceType2"
}, {
  policyReferences: [{
  dataType: "Metric"
}],
  sourceType: "sourceTYpe3"
}]

expected output:

[{
  policyReferences: [
{
  dataType: "Metric"
},
{
  dataType: "Datamap"
},
{
  dataType: "All"
},
{
    dataType: "Event"
}
],
  sourceType: "sourceType2"
}, {
  policyReferences: [
  {
  dataType: "Metric"
    },
    {
  dataType: "Event"
    },
    {
  dataType: "Datamap"
    },
],
  sourceType: "sourceTYpe3"
}]

Advertisement

Answer

You need to group the items by sourceType and collect dataType for every group.

function transformDataSources(data) {
    return Object.values(data.reduce((r, s) => {
        const
            sourceType = s.match(/^[^/]+/)[0],
            dataType = s.match(/((.*))/)[1];

        r[sourceType] ??= { sourceType, policyReferences: [] };
        r[sourceType].policyReferences.push({ dataType });
        return r;
    }, {}));
}

const datasources = ["sourceType2 /4 (Metric) Custom", "sourceType2 /4 (Datamap) Custom", "sourceType2 /4 (Event) Custom", "sourceType2 /4 (All) Custom", "sourceTYpe3 /4 (Metric) Custom", "sourceTYpe3 /4 (Datamap) Custom", "sourceTYpe3 /4 (Event) Custom"]

console.log(transformDataSources(datasources));
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement