下划线 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);