首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下划线组和排序嵌套数组

下划线组和排序嵌套数组
EN

Stack Overflow用户
提问于 2016-10-03 22:41:55
回答 1查看 316关注 0票数 0

使用流星,我得到了一个mongo聚合,返回一个反应性变量,如下所示:

代码语言:javascript
复制
[{
"_id": "game1",
"playerpicks": [
  {
    "player": "Chris",
    "pick": "atsa"
  },
  {
    "player": "al",
    "pick": "suh"
  },
  {
    "player": "al",
    "pick": "atsh"
  },
  {
    "player": "Chris",
    "pick": "sua"
  }]  },{
"_id": "game2",
"playerpicks": [
  {
    "player": "al",
    "pick": "atsa"
  },
  {
    "player": "Chris",
    "pick": "suh"
  },
  {
    "player": "Chris",
    "pick": "atsh"
  },
  {
    "player": "al",
    "pick": "sua"
  }]  },  ....  ]

我需要将这些数据转换成一个网格,理想情况如下:

代码语言:javascript
复制
GAME       al          Chris
game1    suh/atsh      sua/atsa
game2    sua/atsa      suh/atsh

假设这是一个很大的挑战,我可以这样做:

代码语言:javascript
复制
game 1    al: suh/atsh     Chris:  sua/atsa
game 2    al: sua/atsa     Chris:  suh/atsh

我看到Mongo需要排序才能在客户端进行排序,所以我专注于使用下划线,但即使在嵌套数组“播放者选择”的_.sortBy或_.groupBy的初始步骤中也无法获得任何结果。

我的尝试如下:

代码语言:javascript
复制
_.each(monArr, function(obj){ _.each(obj.playerpicks, function(nst){ _.groupBy( nst.player ) }) })

以及:

代码语言:javascript
复制
_.groupBy(monArr, function(obj){return obj.playerpicks.player})

但我离得太远了。没有返回数据。任何建议都非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-04 08:35:21

下面是一种使用大量下划线函数的解决方案,将其分解为离散块,希望能使其更加可读性:

代码语言:javascript
复制
// helper function to combine a player's picks into a string delimited by '/'
let combinePicks = player => _.pluck(player, 'pick').join('/');

// helper function to group a game by a player
let groupGame = game => _.chain(game.playerpicks)
    .groupBy('player')
    .mapObject(combinePicks)
    .value();

// map the data to create the object in the required form
let result = _.map(data, game => _.extend({GAME: game._id}, groupGame(game) ));

对于不支持mapObject (Pre1.8)的较早版本的下划线,可以使用result实现相同的结果:

代码语言:javascript
复制
let combinePicks = function(memo, player, key){
    memo[key] = _.pluck(player, 'pick').join('/');
    return memo;
} 

let groupGame = game => _.chain(game.playerpicks)
    .groupBy('player')
    .reduce(combinePicks, {})
    .value();

代码语言:javascript
复制
		var data = [{
"_id": "game1",
"playerpicks": [
  {
    "player": "Chris",
    "pick": "atsa"
  },
  {
    "player": "al",
    "pick": "suh"
  },
  {
    "player": "al",
    "pick": "atsh"
  },
  {
    "player": "Chris",
    "pick": "sua"
  }]  },{
"_id": "game2",
"playerpicks": [
  {
    "player": "al",
    "pick": "atsa"
  },
  {
    "player": "Chris",
    "pick": "suh"
  },
  {
    "player": "Chris",
    "pick": "atsh"
  },
  {
    "player": "al",
    "pick": "sua"
  }]  }
	];

	let combinePicks = player => _.pluck(player, 'pick').join('/');

	let groupGame = game => _.chain(game.playerpicks)
		.groupBy('player')
		.mapObject(combinePicks)
		.value();
	
	let result = _.map(data, game => _.extend({GAME: game._id}, groupGame(game) ));


document.getElementById('result').textContent = JSON.stringify(result);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

<p>
  <pre id="result"></pre>
</p>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39841547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档