下划线 groupBy 内键
underscore groupBy inner key
我正在尝试 _.groupBy
使用我的 collection 中的一个 object 中的密钥。
示例:
鉴于以下 collection:
[
{ _id: 1234, data: { label: '1' } },
{ _id: 2345, data: { label: '1' } },
{ _id: 3456, data: { label: '1' } },
{ _id: 4567, data: { label: '2' } }
]
按 _id
这样的一级键分组得到以下结果:{1234: Array(1), 2345: Array(1), 3456: Array(1), 4567: Array(1)}
,这是正确的。
是否可以像label
一样按不在第一层的键进行分组?
我正在执行以下操作:_.groupBy(A, 'data.label')
但结果是 {undefined: Array(4)}
我想要 {1: Array(3), 2: Array(1)}
.
PS: 我无法规范化我的数据,结构就是这样。
谢谢。
你可以试试这样不带下划线的东西。您为路径定义自己的 getter,然后按值分组。希望这有帮助。
const data = [
{ _id: 1234, data: { label: '1' } },
{ _id: 2345, data: { label: '1' } },
{ _id: 3456, data: { label: '1' } },
{ _id: 4567, data: { label: '2' } }
];
const get = (o, path) => path.split('.').reduce((acc, key) => acc[key], o);
const groupBy = (data, path) =>
data.reduce((acc, val) => {
const groupKey = get(val, path);
acc[groupKey] = (acc[groupKey] || []).concat(val);
return acc;
}, {});
console.log(groupBy(data, 'data.label'));
Shorter/Best 答案:_.groupBy(data, item => item.data.label);
我正在尝试 _.groupBy
使用我的 collection 中的一个 object 中的密钥。
示例: 鉴于以下 collection:
[
{ _id: 1234, data: { label: '1' } },
{ _id: 2345, data: { label: '1' } },
{ _id: 3456, data: { label: '1' } },
{ _id: 4567, data: { label: '2' } }
]
按 _id
这样的一级键分组得到以下结果:{1234: Array(1), 2345: Array(1), 3456: Array(1), 4567: Array(1)}
,这是正确的。
是否可以像label
一样按不在第一层的键进行分组?
我正在执行以下操作:_.groupBy(A, 'data.label')
但结果是 {undefined: Array(4)}
我想要 {1: Array(3), 2: Array(1)}
.
PS: 我无法规范化我的数据,结构就是这样。
谢谢。
你可以试试这样不带下划线的东西。您为路径定义自己的 getter,然后按值分组。希望这有帮助。
const data = [
{ _id: 1234, data: { label: '1' } },
{ _id: 2345, data: { label: '1' } },
{ _id: 3456, data: { label: '1' } },
{ _id: 4567, data: { label: '2' } }
];
const get = (o, path) => path.split('.').reduce((acc, key) => acc[key], o);
const groupBy = (data, path) =>
data.reduce((acc, val) => {
const groupKey = get(val, path);
acc[groupKey] = (acc[groupKey] || []).concat(val);
return acc;
}, {});
console.log(groupBy(data, 'data.label'));
Shorter/Best 答案:_.groupBy(data, item => item.data.label);