一个数组中有多个对象,如何将对象属性相同的进行去重?
- 类似于这样
arr = [
{
a: '1',
b: 'q1'
},
{
a: '2',
b: 'q2'
},
{
a: '1',
b: 'q3'
},
{
a: '1',
b: 'q4'
},
{
a: '2',
b: 'q5'
},
{
a: '3',
b: 'q6'
}
]
- 需要变成这样:
处理这样的数据使特定属性相同(例如这里的属性‘a’)的对象去重,并让序号在后的对象覆盖序号在前的除‘a’以外的所有属性
arr = [
{
a: '1',
b: 'q4'
},
{
a: '2',
b: 'q5'
},
{
a: '3',
b: 'q6'
}
]
- 解决方案核心部分
let O = this.toUp.map(questionId => questionId['questionId']).reduce((o, k, i) => [o[k] = i, o][1], {
})
// 对 `questionId` 值进行一次统计整理,形如 { questionId值: 最后一次在 toUp 中出现的位置 }
// [{'1': 3}, {'2': 4}, {'3': 5}]
// 对刚才的整理结果再进行一次整理
Object.keys(O).map(k => {
// 此处的 k 就是刚才 { questionId值: 最后一次在 toUp 中出现的位置 } 里的 questionId 值
// 构造一个新的 object
let o = {
questionId: k};
// O[k] 就是取出 k 所对应的 a 值最后一次在 toUp 中出现的位置
// toUp[O[k]] 就是 k 所对应的 questionId 值最后一次在 toUp 中出现时所处的对象
// 对 toUp[O[k]] 遍历一次键
Object.keys(this.toUp[O[k]]).forEach(key => o[key] = key === 'questionId' ? o[key] : this.toUp[O[k]][key]);
// 把 toUp[O[