对对象数组进行排序,并将具有相同 key/value 对的对象推送到新数组

Sort through an array of objects and push objects with the same key/value pair to a new array

我需要对对象数组进行排序,并将具有相同 key/value 对的对象推送到新数组。

我正在整理的对象是足球运动员。我将所有玩家都放在一个对象数组中,并希望将每个位置推入他们自己的数组中。

例如。每个对象都有一个 "position" 键,因此任何具有 "QB" 键 "position" 值的对象都应该被推入一个新数组 "Quarterbacks".

这是目前为止的代码 — 它在 Angular 中,所以我首先将所有玩家保存到一个变量 "Roster" 中,然后需要将玩家按位置分开到单独的数组中,以保存所有玩家那个位置。

angular.module('clientApp')
  .controller('PlayersCtrl', function (
    $scope,
    Player
  ) {
    // $scope.players = Player.getList().$object;
    var Roster = Player.getList().$object;

    console.log(Roster);
    
});

虽然我有兴趣学习如何在将所有位置推入其自己的数组的一个函数中完成所有这些操作,但我也想弄清楚如何为一个位置执行此操作。比如如何将花名册中的所有四分卫推入新的四分卫阵容。

var positions = {};

for(var i = 0; i < Roster.length; i++) {
    var position = Roster[i].position;
    positions[position] = positions[position] || [];
    positions[position].push(Roster[i]);
}

好吧,您可以使用 forEach 循环遍历它,然后根据位置图分配您的球员。

在我的示例中(请原谅我的足球知识),我 运行 通过 arrayOfObject 使用 forEach 函数(感谢顶部的 'use strict'; 语句提供) , 然后使用实际对象的位置 属性 检查它是否已经在 targetObject 中有一个数组,如果没有,我创建一个新数组并将玩家推入其中。

最后的日志语句会显示输出结果。我额外添加了从位置 QB 到 QuarterBack 的映射。如果找不到地图,它将采用实际位置:)

'use strict';

var arrayOfObject = [
    { name: 'player', position: 'QB' },
    { name: 'player 2', position: 'W' },
    { name: 'player 3', position: 'RW' }
], targetObject = {}, map = {
  'QB': 'QuarterBacks',
  'W': 'Wingers',
  'RW': 'RightWingers'
};


arrayOfObject.forEach(function(player) {
  var pos = player.position,
      mappedPosition = map[pos] || pos;
  if (!targetObject[mappedPosition]) {
    targetObject[mappedPosition] = [];
  }
  targetObject[mappedPosition].push(player);
});

console.log(targetObject);

如果您为每个数组定义一个单独的数组,您可以使用 switch 语句。

var roster  = [
  {player: "Ben", position: "qb", salary: 1000},
  {player: "Brown", position: "wr", salary: 1200},
  {player: "Landry", position: "qb", salary: 800}
];

var qbArray = [];
var wrArray = [];

function parseIntoArrayByPosition() {
  for (var i = 0; i < roster.length; i++) {
    var position = roster[i].position;

    switch (position) {
      case "qb":
        qbArray.push(roster[i]);
        break;
      case "wr":
        wrArray.push(roster[i]);
        break;
    }
  }
}

我的做法可能略有不同,但 JavaScript 似乎允许您以多种方式做事。如果我从@dspano 的答案中蚕食列表,我的代码会得到这个:

function createListByPosition(inputList, desiredPosition) {
    var outputList = new Array();
    for (var i = 0; i < inputList.length; i++) {
        var position = inputList[i].position;
        if (position === desiredPosition)
        {
            outputList.push(inputList[i])
        }
    }
    return outputList;
}
var quaterbackList = createListByPosition(roster, 'qb');

这还具有非常通用的好处。