下划线组通过内键

时间:2018-12-10 14:17:44

标签: underscore.js

我正在尝试_.groupBy在我的收藏夹的一个对象内使用密钥。

示例: 给定以下集合:

[
  { _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:我无法规范我的数据,其结构保持不变。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试不加下划线的类似内容。您可以为路径定义自己的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'));

答案 1 :(得分:0)

更短/最佳答案:_.groupBy(data, item => item.data.label);