Javascript 将数组与underline.js合并

Javascript 将数组与underline.js合并,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,在执行了一些underline.js操作(.map、.each、.pulk、和.flatte)之后,我有一个如下的对象数组: var userArray = [ {id: 123456, username: "bill123", group: "ONE"}, {id: 123457, username: "joe123", group: "TWO"}, {id: 123457, username: "joe123", group: "TWO"}, {id: 123458, use

在执行了一些underline.js操作(
.map
.each
.pulk
、和
.flatte
)之后,我有一个如下的对象数组:

var userArray = [
  {id: 123456, username: "bill123", group: "ONE"},
  {id: 123457, username: "joe123", group: "TWO"},
  {id: 123457, username: "joe123", group: "TWO"},
  {id: 123458, username: "jim123", group: "ONE"}
]
{id: 123457, username: "joe123", group: "TWO", count: 2}
我需要创建一个新数组,删除重复项,并计算对象在数组中出现的次数。我能够通过两个单独的函数获得所需的结果,但在合并这两个结果时遇到困难

其工作功能如下:

var uniqUsers = _.uniq(taggedUsers, false, function(user) {
  return user.id
});
  //returns array of unique objects in the same format as above
  //[{id: 123457, username: "joe123", group: "TWO"},...]

var userCounts = _.countBy(taggedUsers, "id");
  //returns the count for each user in the userArray in a single object
  //{123456: 1, 123457: 2, 123458: 1}

返回如下对象数组的最佳方法是:

var userArray = [
  {id: 123456, username: "bill123", group: "ONE"},
  {id: 123457, username: "joe123", group: "TWO"},
  {id: 123457, username: "joe123", group: "TWO"},
  {id: 123458, username: "jim123", group: "ONE"}
]
{id: 123457, username: "joe123", group: "TWO", count: 2}
我是否可以向
\uu.countBy
功能添加其他字段?或者我需要用
\uuu.map
做些什么


任何帮助都将不胜感激!谢谢

我只想用两个
就可以了。每个
s:

var uniquedUsersWithCount = [],
    userIDToCount = {};

_.each(taggedUsers, function (user) {
  if (userIDToCount[user.id] !== undefined) {
    userIDToCount[user.id] += 1;
  } else {
    userIDToCount[user.id] = 0;
    uniquedUsersWithCount.push(user);
  }
});

_.each(uniquedUsersWithCount, function (user) {
  var count = userIDToCount[user.id];
  if (count !== undefined) {
    user.count = count;
  }
});

我只需要用两个
就可以了。每个
s:

var uniquedUsersWithCount = [],
    userIDToCount = {};

_.each(taggedUsers, function (user) {
  if (userIDToCount[user.id] !== undefined) {
    userIDToCount[user.id] += 1;
  } else {
    userIDToCount[user.id] = 0;
    uniquedUsersWithCount.push(user);
  }
});

_.each(uniquedUsersWithCount, function (user) {
  var count = userIDToCount[user.id];
  if (count !== undefined) {
    user.count = count;
  }
});

您可以使用
userCounts
上的
map
创建一个新数组,然后对其进行排序

var userArray = [
  {id: 123456, username: "bill123", group: "ONE"},
  {id: 123457, username: "joe123", group: "TWO"},
  {id: 123457, username: "joe123", group: "TWO"},
  {id: 123458, username: "jim123", group: "ONE"}
];

var userCounts = _.countBy(userArray, "id");

var result = _.sortBy(_.map(userCounts, function(count, id) {
  var user = _.findWhere(userArray, {id: Number(id)});  
  return _.extend({}, user, {count: count});
}), 'count');

console.log(result);
结果:

[[object Object] {
  count: 1,
  group: "ONE",
  id: 123456,
  username: "bill123"
}, [object Object] {
  count: 1,
  group: "ONE",
  id: 123458,
  username: "jim123"
}, [object Object] {
  count: 2,
  group: "TWO",
  id: 123457,
  username: "joe123"
}]

您可以使用
userCounts
上的
map
创建一个新数组,然后对其进行排序

var userArray = [
  {id: 123456, username: "bill123", group: "ONE"},
  {id: 123457, username: "joe123", group: "TWO"},
  {id: 123457, username: "joe123", group: "TWO"},
  {id: 123458, username: "jim123", group: "ONE"}
];

var userCounts = _.countBy(userArray, "id");

var result = _.sortBy(_.map(userCounts, function(count, id) {
  var user = _.findWhere(userArray, {id: Number(id)});  
  return _.extend({}, user, {count: count});
}), 'count');

console.log(result);
结果:

[[object Object] {
  count: 1,
  group: "ONE",
  id: 123456,
  username: "bill123"
}, [object Object] {
  count: 1,
  group: "ONE",
  id: 123458,
  username: "jim123"
}, [object Object] {
  count: 2,
  group: "TWO",
  id: 123457,
  username: "joe123"
}]


如果数组是按计数排序的,则也是一个加号!如果数组按计数排序,也将是一个加号!请注意,这将改变
userArray
中的原始对象。如果不需要这样做,则更改
return\uu.extend(用户,{count:count})
to
return{.extend({},user,{count:count})。很好,我将进行编辑,因为我不打算更改原始设置。谢谢@AnidMonsur,该解决方案有效(很抱歉响应延迟)。查看编辑,在
.extend
函数中包含/排除
{}
有什么区别@格雷格兰:这也是按最小数到最大数排序的,我怎么能把它颠倒过来呢?在mongo中,我可以使用
{$sort{count:-1}}}
{$sort{count:-1}}}
,但看不到下划线@AnidMonsur@gregl中的参数将空对象作为第一个参数传递给
确保
用户数组中的原始用户不被修改。你的其他问题已经在其他地方得到了回答。排序可以链接,您可以在任何数组上使用
reverse()
。请注意,这将改变
userArray
中的原始对象。如果不需要这样做,则更改
return\uu.extend(用户,{count:count})
to
return{.extend({},user,{count:count})。很好,我将进行编辑,因为我不打算更改原始设置。谢谢@AnidMonsur,该解决方案有效(很抱歉响应延迟)。查看编辑,在
.extend
函数中包含/排除
{}
有什么区别@格雷格兰:这也是按最小数到最大数排序的,我怎么能把它颠倒过来呢?在mongo中,我可以使用
{$sort{count:-1}}}
{$sort{count:-1}}}
,但看不到下划线@AnidMonsur@gregl中的参数将空对象作为第一个参数传递给
确保
用户数组中的原始用户不被修改。你的其他问题已经在其他地方得到了回答。排序可以链接,您可以在任何数组上使用
reverse()
。这并没有使用下划线的全部功能,但它可能更清晰,更易于阅读。谢谢,这很酷,如果我理解正确,您正在创建一个空数组,将新用户推到其中,计数为1,但是如果用户已经存在,那么在count字段中添加1?但是第二个
\u每个
函数都在做什么?有点困惑的是@vinay第一个循环正在构造
userID
(Number)->
count
(Number)的映射,并将唯一用户(基于ID)推送到
uniqueUsersWithCount
数组。第二个循环是在
uniqueUsersWithCount
数组中的每个条目上添加一个基于先前构造的映射的
count
字段。这并没有使用下划线的全部功能,但可能更清晰的代码更容易阅读。谢谢,这很酷,如果我理解正确,您正在创建一个空数组,在计数为1的情况下将新用户推送到它,但是如果用户已经存在,则在计数字段中添加1?但是第二个
\u每个
函数都在做什么?有点困惑的是@vinay第一个循环正在构造
userID
(Number)->
count
(Number)的映射,并将唯一用户(基于ID)推送到
uniqueUsersWithCount
数组。第二个循环是根据先前构造的映射向
uniqueUsersWithCount
数组中的每个条目添加
count
字段。