从数组javascript中获取每个项目之一

时间:2015-08-08 00:30:12

标签: javascript node.js

我有一个包含对象的数组。其中一个对象属性是" position"。另一个是" player_name"。有很多球员,只有8个独特的位置。我想通过数组并抓住每个位置的第一个玩家并将其移动到一个新阵列。最后,我应该有一个新的阵列,总共有8名球员,每个球员都有一个独特的位置。

这是我的代码:

// Sample Object: { "name": "Frank Johnson", "position": "C", "cnx": "17" }

function compare(a,b) {
  if (parseFloat(a.cnx) < b.cnx)
    return -1;
  if (parseFloat(a.cnx) > b.cnx)
    return 1;
  return 0;
}

var sorted = array.sort(compare);
var new_array = []
sorted.forEach(function (i) {
  if (i.position === "1B" ) {
    new_array.push(i)
    // How do I make it stop looking for 1B's at this point??
  }
})

2 个答案:

答案 0 :(得分:1)

保留您在数组中遇到的位置的地图,并添加不在地图中的每个对象:

function compare(a,b) {
  if (parseFloat(a.cnx) < b.cnx)
    return -1;
  if (parseFloat(a.cnx) > b.cnx)
    return 1;
  return 0;
}

array.sort(compare);
var new_array = [];
var positions = {};
array.forEach(function (i) {
  if (!(i.position in positions)) {
    positions[i.position] = 1;
    new_array.push(i);
  }
});

要从任何位置获得多个玩家,您可以将地图项目用作计数器并为特定位置设置初始值:

array.sort(compare);
var new_array = [];
var positions = { OF: 3 };
array.forEach(function (i) {
  if (!(i.position in positions)) {
    positions[i.position] = 1;
  }
  if (positions[i.position] > 0) {
    positions[i.position]--;
    new_array.push(i);
  }
});

(您也可以使用它来省略位置,例如{ OF: 3, C: 0 })。

答案 1 :(得分:0)

使用非常受欢迎的lodash库:

假设你有一个对象数组,例如:

var data = [
  { "name": "Player 1", "position": "C", "cnx": "17" },
  { "name": "Player 2", "position": "B", "cnx": "17" },
  { "name": "Player 3", "position": "B", "cnx": "17" }
];

您可以按位置获得第一位玩家:

_.mapValues(_.groupBy(data, 'position'), _.first);

输出:

{
  "C": {
    "name": "Player 1",
    "position": "C",
    "cnx": "17"
  },
  "B": {
    "name": "Player 2",
    "position": "B",
    "cnx": "17"
  }
}

如果您想要数组格式,可以使用:

_.values(_.mapValues(_.groupBy(x, 'position'), _.first))

输出:

[
  {
    "name": "Player 1",
    "position": "C",
    "cnx": "17"
  },
  {
    "name": "Player 2",
    "position": "B",
    "cnx": "17"
  }
]