首页 > 解决方案 > 如何通过对象数组中对象的属性删除重复项并复制重复项的所有属性?

问题描述

我通过对象数组中对象的“sourceType”属性删除了所有重复项,但我无法将“dataType”属性从重复项复制到原始项,请检查我在输出和预期输出中的期望

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)

输出:

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

预期输出:

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

标签: javascriptarraysalgorithm

解决方案


您需要对项目进行分组sourceType并为每个组收集dataType

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));


推荐阅读