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

时间:2015-12-04 19:10:57

标签: javascript arrays angularjs sorting javascript-objects

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

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

实施例。每个对象都有一个“位置”键,因此任何对象“位置”值为“QB”的对象都应该被推入一个新的数组“四分卫”。

这是迄今为止的代码 - 它是在Angular中所以我首先将所有玩家保存到变量“Roster”中,然后需要将玩家按位置分隔成单独的阵列,以保持所有玩家的位置。

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

    console.log(Roster);
    
});

虽然我有兴趣学习如何在一个函数中将所有位置推入自己的数组中,但我也想知道如何在一个位置执行此操作。就像如何将所有四分卫从名册推到一个新的四分卫阵容中。

4 个答案:

答案 0 :(得分:0)

var positions = {};

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

答案 1 :(得分:0)

好吧,你可以通过forEach循环来完成它,然后根据位置图分配你的玩家。

在我的例子中(借口我的足球知识),我使用forEach函数(由于顶部的arrayOfObject语句提供)运行'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);

答案 2 :(得分:0)

如果要为每个数组定义一个单独的数组,则可以使用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;
    }
  }
}

答案 3 :(得分:0)

我可能会略有不同,但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');

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