Javascript lodash groupBy所有关键点是最有效的方法

Javascript lodash groupBy所有关键点是最有效的方法,javascript,grouping,lodash,Javascript,Grouping,Lodash,我试图找到一种有效的方法来聚合集合中的所有项目 例如,如果值不是子对象或数组,使用Lodash按对象集合的每个键(深度)对对象集合进行分组的最有效方法是什么 let input = [{ food: { fruits: { apples: 2, bananas: 3, peaches: 'square', citrus: [100,200,300] },

我试图找到一种有效的方法来聚合集合中的所有项目

例如,如果值不是子对象或数组,使用Lodash按对象集合的每个键(深度)对对象集合进行分组的最有效方法是什么

let input = [{
    food: {
        fruits: {
            apples: 2,
            bananas: 3,
            peaches: 'square',
            citrus: [100,200,300] 
        },
        meat: {
            beef: 1000,
            chicken: 2000
        }
    }
},{
    food: {
        fruits: {
            apples: 4,
            bananas: 5,
            peaches: 'triangle',
            citrus: [101,201,301] 
        },
        meat: {
            beef: 1001,
            chicken: 2001
        }
    }
}];

let output = {
    food: {
        fruits: {
            apples: [2,4],
            bananas: [3,5],
            peaches: ['square', 'triangle'],
            citrus: [[100,101],[200,201],[300,301]]
        },
        meat: {
            beef: [1000, 1001],
            chicken: [2000, 2001]
        }
    }
}
API中似乎没有这样做的函数,我想知道是否有一种方法可以在一个过程中做到这一点,而不必在初始集合上重复多次。

您可以按如下方式使用:

const output = _.mergeWith({}, ...input, (t, s) => {
  if (!_.isObject(s)) return t ? [...t, s] : [s]
});
const输入=[{
食物:{
水果:{
苹果:2,
香蕉:3,
桃子:“方形”,
柑橘类:[100200300]
},
肉类:{
牛肉:1000,
鸡肉:2000
}
}
}, {
食物:{
水果:{
苹果:4,
香蕉:5,
桃子:“三角形”,
柑橘:[101201301]
},
肉类:{
牛肉:1001,
鸡肉:2001
}
}
}];
常量输出=\与({},…输入合并,(t,s)=>{
如果(!\u.isObject(s))返回t?[…t,s]:[s]
});
控制台日志(输出)

输出的
citrus
有3个数组,而不是2个,这是故意的吗?与所有这些类型的问题一样,您需要查看
Array.prototype.reduce
。此外,第一项有
peach
,第二项有
peaches
。类似的问题与
citrus
critus
以及
beaf
可能是
beef
。编程中的拼写问题是的,对不起,我直接在这里编辑了我的示例,我应该在IDE中完成。它是固定的,对于citrus,它应该是一个数组数组,假设集合中的所有项目在属性大小等方面都是同质的。我不知道我怎么会在文档中遗漏它,可能与我犯了这么多不一致的错误的原因相同:我应该多睡一会儿:)。谢谢你的回答,这正是我想要的。