Как сгруппировать объекты в массиве по их номеру - PullRequest
0 голосов
/ 26 апреля 2019

Я уже отсортировал свой список массивов и упорядочил его по порядку по номеру соответствующей группы, но мне нужно сгруппировать его ( скажем, от лидера и его / ее члена ).Я хочу иметь дополнительные поля, чтобы, если у объекта не было того же номера группы, он будет автоматически помечен как лидер, следовательно, если у объекта будет тот же номер группы, первый объект в последовательности будет помечен как лидер ипрочее будет автоматически помечено как член.

Это мой код для сортировки списка моих массивов и его вывода / вывода.

$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 Ответ

1 голос
/ 26 апреля 2019

Вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...