如何按对象的各自组号对数组中的对象进行分组

时间:2019-04-26 02:39:30

标签: javascript arrays angularjs

我已经对数组列表进行了排序,并按照它们各自的组号进行了排列,但是我需要对其进行分组(由领导者及其成员说)。我想要额外的字段,如果对象没有相同的组号,它将自动标记为领导者,因此,如果对象具有相同的组号,则序列中的第一个对象将被标记为领导者,并且其他将被自动标记为成员。

  

这是我用于排列阵列列表的代码,它是控制台/输出。

$scope.sortedTopAgent = [];
var c = 0;
var sortTopAgentByGroup = function () {
for (const [index, value] of accountArray.entries()) {
    for (const [index2, value2] of TeamArray.entries()) {
        if (value2.accountname == value) {
            c = c + 1;

            $scope.sortedTopAgent.push(value2); 

            $scope.sortedTopAgent.sort(function (a, b) {
                return a.groupNo - b.groupNo;
            });
            console.log($scope.sortedTopAgent)

            //console >>

            [{
                "name": "John",
                "groupNo": 1
            },
            {
                "name": "Chelsea",
                "groupNo": 1
            },
            {
                "name": "Mark",
                "groupNo": 1
            },
            {
                "name": "Peter",
                "groupNo": 5
            },
            {
                "name": "Arya",
                "groupNo": 5
            },
            {
                "name": "Robert",
                "groupNo": 7
            },
            {
                "name": "Mary",
                "groupNo": 8
            }
        ]
            // end of console
        }
    }
}

};

我想要一个看起来像这样的数组:

[{
    "name": "John",
    "groupNo": 1,
    "leaderNo": 1,
    "memberNo": ""
  },
  {
    "name": "Chelsea",
    "groupNo": 1,
    "leaderNo": "",
    "memberNo": 1
  },
  {
    "name": "Mark",
    "groupNo": 1,
    "leaderNo": "",
    "memberNo": 1
  },
  {
    "name": "Peter",
    "groupNo": 5,
    "leaderNo": 2,
    "memberNo": ""
  },
  {
    "name": "Arya",
    "groupNo": 5,
    "leaderNo": "",
    "memberNo": 2
  },
  {
    "name": "Robert",
    "groupNo": 7,
    "leaderNo": 3,
    "memberNo": ""
  },
  {
    "name": "Mary",
    "groupNo": 8,
    "leaderNo": 4,
    "memberNo": ""
  }
]

1 个答案:

答案 0 :(得分:1)

您可以使用Array#map来确定是否已找到领导者。

在这里,我将Array#map的第二个参数用作Set,最终成为地图回调函数中的this值。如果需要,我使用size属性确定leaderNo / groupNo

您可以选择任何方便的方式。

const data = [{
    "name": "John",
    "groupNo": 1
  },
  {
    "name": "Chelsea",
    "groupNo": 1
  },
  {
    "name": "Mark",
    "groupNo": 1
  },
  {
    "name": "Peter",
    "groupNo": 5
  },
  {
    "name": "Arya",
    "groupNo": 5
  },
  {
    "name": "Robert",
    "groupNo": 7
  },
  {
    "name": "Mary",
    "groupNo": 8
  }
];

const output = data.map(function(member) {
  if (this.has(member.groupNo)) {
    // Member
    return {
      ...member,
      "leaderNo": "",
      "memberNo": this.size
    }
  }
  // Leader
  this.add(member.groupNo)
  return {
    ...member,
    "leaderNo": this.size,
    "memberNo": ""
  }
}, new Set())

console.log(output);