按多个值分组Undercore.JS,但保留键和值
Group by multiple values Underscore.JS but keep the keys and values
我正在尝试用对象对以下数组进行分组:
[ { user_id: 301, alert_id: 199, deal_id: 32243 },
{ user_id: 301, alert_id: 200, deal_id: 32243 },
{ user_id: 301, alert_id: 200, deal_id: 107293 },
{ user_id: 301, alert_id: 200, deal_id: 277470 } ]
正如您所看到的,它包含user_id和alert_id组合,我喜欢将它们分组。所以我想要以下数组:
[ { user_id: 301, alert_id: 199, deals: [32243] },
{ user_id: 301, alert_id: 200, deals: [32243,107293,277470]}]
有人知道解决这个问题的办法吗?使用下划线的GroupBy,我可以根据一个键对值进行分组。但我需要根据user_id和alert_id的组合对它们进行分组,正如您所看到的。
我看了undercore.nest,但问题是它创建了自己的密钥。
将groupBy与使用user_id和alert_id创建复合密钥的函数一起使用。然后绘制分组以获得您想要的:
var list = [ { user_id: 301, alert_id: 199, deal_id: 32243 },
{ user_id: 301, alert_id: 200, deal_id: 32243 },
{ user_id: 301, alert_id: 200, deal_id: 107293 },
{ user_id: 301, alert_id: 200, deal_id: 277470 } ];
var groups = _.groupBy(list, function(value){
return value.user_id + '#' + value.alert_id;
});
var data = _.map(groups, function(group){
return {
user_id: group[0].user_id,
alert_id: group[0].alert_id,
deals: _.pluck(group, 'deal_id')
}
});
我想贡献一个整洁的打字脚本ES6组。
我真的不知道如何加强返回值的键入。这里需要一些技巧,但这对我来说相当有效
/**
* group the supplied list by a set of keys.
* @param list the list of items to group.
* @param children the key for the array of child items.
* @param components the components to group by.
*/
groupByMultipleFields<T, K extends keyof T>(
list: T[],
children: string,
...components: K[]): any[] {
var grouping = [...list.reduce((r, o) => {
const key = components.map(_ => `${o[_]}`).join(" :: ");
var keyed = r.get(key) || components.reduce((x, y) => { x[y] = o[y]; return x; }, <T>{});
keyed[children] = keyed[children] || [];
keyed[children].push(o);
return r.set(key, keyed);
}, new Map).values()];
return grouping;
}
您需要打开typescript编译器选项"downlevelIteration": true
,以允许new Map
迭代并返回values()
。
对于某些特定的任务,我必须为其保护密钥和值所以我制作了这个变体(使用干净的js):
/**
* Group your items in array by multiple keys!
*
* @param collection
* @param retrieveFunctions
* @param compareFunctions
* @returns {Array}
*/
function groupify(
collection,
retrieveFunctions = {attribute: value => value},
compareFunctions = {attribute: (groupValue, value) => groupValue === value}
) {
let groups = [];
let keyValues = {};
collection.forEach(item => {
for (let attribute in retrieveFunctions) {
keyValues[attribute] = retrieveFunctions.hasOwnProperty(attribute) ? retrieveFunctions[attribute](item[attribute]) : undefined;
}
let group = groups.find(group => {
for (let key in retrieveFunctions) {
if (!group && !group.keys[key]) {
return false;
}
if (compareFunctions[key] instanceof Function) {
if (!compareFunctions[key](group.keys[key], keyValues[key])) {
return false;
}
} else if (group.keys[key] !== keyValues[key]) {
return false;
}
}
return true;
});
!group ? groups.push({keys: keyValues, items: [item]}) : group.items.push(item);
keyValues = {};
});
return groups;
}
以下是要点链接:groupify.js
相关文章:
- 如何添加动态表单元素但保留其值(JS)
- JS坐标->PHP脚本-如何在PHP中保留变量
- 为什么“;闭合的“;保留字是JS
- EXT-JS 4.2.1 保留表单 - 面板滚动条的当前位置
- 点击后历史记录.js是否保留在页面上
- 文件中.js变量不会保留 AJAX 的值
- 在挖空.js模板中保留 Razor 语法突出显示
- 保留 Fabric 中图像的纵横比.js
- 如何在角度 JS 路由中保留模板视图
- 离开页面并返回页面时,不会保留 JS 页面格式
- 仅在 Ember .js 中提交后保留数据
- 是否可以在JS中获取保留字(变量,函数,对象名称)的列表
- JS - 对象内的保留词
- 角度JS从数据中选择菜单,在顶部保留1个项目
- hammer.js - 如何在不传播“点击”事件的情况下注册“保留”事件
- 在 Meteor.js 中保留表单值
- 将JS分解为带有$(document).ready()的文件,但保留范围
- 如何在 d3.js 中调整图像大小时不保留纵横比
- 如何使用Knockout JS应用绑定并保留输入值
- 如何使用JS保留下拉列表的值