通过与相同的ID值进行比较来转换对象列表并转换为不同的格式

问题描述 投票:0回答:3

这是具有不同性别数据的列表。

[
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "q": 358,
    "s": 158,
    "gender": "M"
  },
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "q": 328,
    "s": 258,
    "gender": "F"
  },
  {
    "ageCode": 3,
    "ageDesc": "15-59",
    "q": 525,
    "s": 125,
    "gender": "M"
  },
  {
    "agCode": 4,
    "ageDesc": "60+",
    "q": 458,
    "s": 358,
    "gender": "F"
  }
]

上面的列表需要根据ageCode合并到下面的列表,所以相同。它需要合并两个年龄代码相同的对象。转换后的列表如下所示。

[
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "qM": 358,
    "sM": 158,
    "qF": 328,
    "sF": 258
  }
  {
    "ageCode": 3,
    "ageDesc": "15-59",
    "qM": 525,
    "sM": 125
  },
  {
    "agCode": 4,
    "ageDesc": "60+",
    "qF": 458,
    "sF": 358
  }
]

尝试的解决方案:

  for(let item  of this.ageData) {
        if (this.ageData.find((i) => { i.agCode=== item.agCode})){

//}

    }

这里需要重复和多个for循环之类的问题,有没有有效的方法来实现这一目标。

angular angular7 angular8
3个回答
0
投票

请尝试下一个。

const data = [
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "q": 358,
    "s": 158,
    "gender": "M"
  },
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "q": 328,
    "s": 258,
    "gender": "F"
  },
  {
    "ageCode": 3,
    "ageDesc": "15-59",
    "q": 525,
    "s": 125,
    "gender": "M"
  },
  {
    "ageCode": 4,
    "ageDesc": "60+",
    "q": 458,
    "s": 358,
    "gender": "F"
  }
];

const combined = Object.values(data.reduce((result, item) => {
if (!result[item.ageCode]) {
  result[item.ageCode] = {ageCode: item.ageCode, ageDesc: item.ageDesc};
}
result[item.ageCode]['s' + item.gender] = item.s;
result[item.ageCode]['q' + item.gender] = item.q;
return result;
}, {}));

console.log(combined);

0
投票

这是一个解决方案:

  listContact = [
    {
      "ageCode": 1,
      "ageDesc": "0-4",
      "q": 358,
      "s": 158,
      "gender": "M"
    },
    {
      "ageCode": 1,
      "ageDesc": "0-4",
      "q": 328,
      "s": 258,
      "gender": "F"
    },
    {
      "ageCode": 3,
      "ageDesc": "15-59",
      "q": 525,
      "s": 125,
      "gender": "M"
    },
    {
      "ageCode": 4,
      "ageDesc": "60+",
      "q": 458,
      "s": 358,
      "gender": "F"
    }
  ];
  listContact2 = [
    {
      "ageCode": 1,
      "ageDesc": "0-4",
      "qM": 358,
      "sM": 158,
      "qF": 328,
      "sF": 258
    },
    {
      "ageCode": 3,
      "ageDesc": "15-59",
      "qM": 525,
      "sM": 125
    },
    {
      "ageCode": 4,
      "ageDesc": "60+",
      "qF": 458,
      "sF": 358
    }
  ];
  uniqueListContact = [];
  flags = {};

...
this.uniqueListContact = [...this.listContact, ...this.listContact2];
this.uniqueListContact = this.uniqueListContact.filter((entry) => {
    if (this.flags[entry.ageCode]) {
        return false;
    }
    this.flags[entry.ageCode] = true;
    return true;
});

这里有一个完整的工作示例:https://stackblitz.com/edit/angular-merge-and-distinct-array-from-property?file=src/app/app.component.ts


0
投票

我使用了Array,reduce并已将对象项作为Accumularor分配给Object,当完成所有分配后,我取出了累加器的值。

const arr = [
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "q": 358,
    "s": 158,
    "gender": "M"
  },
  {
    "ageCode": 1,
    "ageDesc": "0-4",
    "q": 328,
    "s": 258,
    "gender": "F"
  },
  {
    "ageCode": 3,
    "ageDesc": "15-59",
    "q": 525,
    "s": 125,
    "gender": "M"
  },
  {
    "ageCode": 4,
    "ageDesc": "60+",
    "q": 458,
    "s": 358,
    "gender": "F"
  }
]

const merged = arr.reduce((acc, ob) => {
  const qGender = 'q' + ob.gender;
  const sGender = 's' + ob.gender
  if (acc[ob.ageCode]) {
    Object.assign(acc[ob.ageCode], { [qGender]: ob.q, [sGender]: ob.s })
  } else {
    acc[ob.ageCode] = { ageCode: ob.ageCode, ageDesc: ob.ageDesc, [sGender]: ob.s, [qGender]: ob.q }
  }
  
  return acc;
}, {})

const mergeArr = Object.values(merged);
console.log(mergeArr)
© www.soinside.com 2019 - 2024. All rights reserved.