通过对象的属性重新组合对象数组

时间:2016-06-08 10:56:11

标签: javascript typescript

我有一个对象数组(Employee {role: string, members: string []}

array = [{
  role: 'doctor',
  fullName: 'x'
}, {
  role: 'nurse',
  fullName: 'y'
}, {
  role: 'doctor',
  fullName: 'z'
}]

我希望按类型脚本

中的新数组(结果)中的角色对对象进行分组
result = [{
    role: 'doctor',
    members: ['x', 'z']
  } {
    role: 'nurse',
    members: ['y']
  }
}

我的代码:

result = array.map(function(pemp: any) {

  if (!array.some(function(el: any) {
    return el.role === pemp.role;
  })) {
    return new Employee(pemp.role, pemp.fullName);
  } else {
    var pos = this.result.map(function(e: any) {
      return e.role;
    }).indexOf(pemp.role);
    this.result[pos].members.push(pemp.fullName)
  }
});

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

var data = [{
  role: 'doctor',
  fullName: 'x'
}, {
  role: 'nurse',
  fullName: 'y'
}, {
  role: 'doctor',
  fullName: 'z'
}];

var obj = {};
data.forEach(function(item){
  if(!obj[item.role]) obj[item.role] = [];
  obj[item.role].push(item.fullName);
});

var result = Object.keys(obj).map(function(k){
  return {role:k, members: obj[k]}
});

document.getElementById("result").innerHTML = JSON.stringify(result,0,4)
<pre id="result"></pre>

答案 1 :(得分:0)

虽然这不是打字稿中的解决方案,但您可以使用带有Array#forEach的单个循环和一个临时对象作为分组角色的结果数组的引用。

var array = [{ role: 'doctor', fullName: 'x' }, { role: 'nurse', fullName: 'y' }, { role: 'doctor', fullName: 'z' }],
    result = [];

array.forEach(function (a) {
    if (!this[a.role]) {
        this[a.role] = { role: a.role, members: [] };
        result.push(this[a.role]);
    }
    this[a.role].members.push(a.fullName);
}, Object.create(null));

console.log(result);