【问题标题】:Sort through an array of objects and push objects with the same key/value pair to a new array对对象数组进行排序,并将具有相同键/值对的对象推送到新数组
【发布时间】:2015-12-04 19:10:56
【问题描述】:

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

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

例如。每个对象都有一个“位置”键,因此键“位置”的值为“QB”的任何对象都应该被推入一个新数组“Quarterbacks”中。

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

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

    console.log(Roster);
    
});

虽然我有兴趣学习如何在一个将所有位置推入自己的数组的函数中完成这一切,但我也想弄清楚如何为一个位置做这件事。就像如何将所有四分卫从名单中推到一个新的四分卫阵列中。

【问题讨论】:

  • 提供一些演示数据如何?
  • @Icepickle 让我知道这是否有帮助... Roster 对象是一个由 58 个对象组成的数组,每个对象是一个玩家。每个玩家对象都有三个键/值对——位置、姓名和薪水。我想通过位置来识别每个玩家,如果位置是 QB,则将每个玩家(完整对象)推入一个新数组。

标签: javascript arrays angularjs sorting javascript-objects


【解决方案1】:

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

【讨论】:

  • 让它返回一个空数组,不知道为什么我不能从这些答案中取回任何数据......
  • @Krang 您是否确保“名册”具有数据并且其格式符合您的预期?
【解决方案2】:
var positions = {};

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

【讨论】:

    【解决方案3】:

    嗯,你可以用一个 forEach 循环来完成它,然后根据位置图分配你的玩家。

    在我的示例中(请原谅我的足球知识),我使用 forEach 函数(由顶部的 'use strict'; 语句提供)运行arrayOfObject,然后使用实际的位置属性对象来检查它是否在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);

    【讨论】:

    • 对不起@Icepickle,这个东西有点绿,所以我不完全确定 targetObject 和 map 是如何工作的——因为它们不包含在我当前的 Roster 对象中(或者在你的示例中,arrayOfObject )。不太确定如何将此解决方案应用于我的顶部代码:/对不起!你能再解释一下吗?感谢您的帮助!
    • 实际上只是让它在我的代码中工作,但它返回了一个没有玩家的对象。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 2019-04-11
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多