Javascript 生成唯一值并筛选数据对象

Javascript 生成唯一值并筛选数据对象,javascript,json,object,lodash,Javascript,Json,Object,Lodash,我试图按发酵类型过滤这些数据,然后针对每种发酵类型,将使用和年份的唯一值组合为数组。对于“made”,我想按年份将所有值相加 ferments = [ {"ferment": "cabbage", "use": "sauerkraut", "year": "2018", "made": 2}, {"ferment": "

我试图按发酵类型过滤这些数据,然后针对每种发酵类型,将使用和年份的唯一值组合为数组。对于“made”,我想按年份将所有值相加

ferments = [
  {"ferment": "cabbage", "use": "sauerkraut", "year": "2018", "made": 2},
  {"ferment": "cabbage", "use": "pickled", "year": "2018", "made": 1},
  {"ferment": "cabbage", "use": "sauerkraut", "year": "2019", "made": 2},
  {"ferment": "cabbage", "use": "pickled", "year": "2019", "made": 1},
  {"ferment": "cabbage", "use": "pickled", "year": "2020", "made": 3},
  {"ferment": "beets", "use": "pickled", "year": "2018", "made": 3},
  {"ferment": "beets", "use": "fermented", "year": "2018", "made": 2},
  {"ferment": "beets", "use": "pickled", "year": "2019", "made": 4},
  {"ferment": "beets", "use": "fermented", "year": "2019", "made": 2},
  {"ferment": "beets", "use": "pickled", "year": "2020", "made": 4},
  {"ferment": "beets", "use": "fermented", "year": "2020", "made": 1}
]
我尝试了许多变体,这是我得到的最接近的(不加上“制造”值)。这给了我一个由两个对象组成的数组,但我想要一个对象,这样我就可以像这样调用它,并获得每个键的相关信息:
发酵[colla]

const groupedByFerment = _(data)
.groupBy("ferment")
.map(d => ({
    // ferment: d[0].ferment,
    use: _(d).flatMap("use").uniq().value(),
    salt: _(d).flatMap("made").uniq().value(),
    year: _(d).flatMap("year").uniq().value(),
}))
.value()
这是我想要的输出:

ferments = {
  cabbage: {
    use: [sauerkraut, pickled],
    year: [2018, 2019, 2020],
    made: [3, 3, 3],
   },
  beets: {
    use: [fermented, pickled],
    year: [2018, 2019, 2020],
    made: [5, 6, 5],
    } 
  }

第一步是使用
.reduce
通过
发酵进行分组。然后,您可以使用
.forOwn
对结果对象进行迭代,以修改年度生成的值,并获得每个项目的唯一
use

const发酵=[
{“发酵”:“卷心菜”,“用途”:“酸菜”,“年份”:“2018”,“制造”:2},
{“发酵”:“白菜”,“用途”:“腌制”,“年份”:“2018”,“制造”:1},
{“发酵”:“卷心菜”,“用途”:“酸菜”,“年份”:“2019”,“制造”:2},
{“发酵”:“卷心菜”,“用途”:“腌制”,“年份”:“2019”,“制造”:1},
{“发酵”:“白菜”,“用途”:“腌制”,“年份”:“2020”,“制造”:3},
{“发酵”:“甜菜”,“用途”:“腌制”,“年份”:“2018”,“制造”:3},
{“发酵”:“甜菜”,“用途”:“发酵”,“年份”:“2018”,“制造”:2},
{“发酵”:“甜菜”,“用途”:“腌制”,“年份”:“2019”,“制造”:4},
{“发酵”:“甜菜”,“用途”:“发酵”,“年份”:“2019”,“制造”:2},
{“发酵”:“甜菜”,“用途”:“腌制”,“年份”:“2020”,“制造”:4},
{“发酵”:“甜菜”,“用途”:“发酵”,“年份”:“2020”,“制造”:1}
];
const group=uu.reduce(发酵,(acc,项目)=>{
常数{发酵,使用,年份,制造}=项目;
const prev=acc[发酵];
acc[发酵]=上一个
使用:[…上一次使用,使用],年份:[…上一次使用,年份],制造:[…上一次制造,制造]]
:{使用:[使用],年份:[年],制造:[制造]};
返回acc;
}, {});
_.forOwn(分组,(值,键)=>{
value.use=uq.uniq(value.use);
const{year:yearList,made:madeList}=value;
const yearMadeMap=\减少(年表,(会计科目、年份、索引)=>{
acc[年度]=马德兰学院[指数]+(acc[年度]| 0)
返回acc;
}, {});
value.year=\关键字(yearMadeMap);
value.made=u.values(yearMadeMap);
});
控制台日志(分组)
const发酵=[
{发酵:“卷心菜”,使用:“泡菜”,年份:“2018”,制造:2},
{发酵:“白菜”,用途:“腌制”,年份:“2018”,制造日期:1},
{发酵:“卷心菜”,使用:“泡菜”,年份:“2019”,制造:2},
{发酵:“白菜”,用途:“腌制”,年份:“2019”,制作:1},
{发酵:“白菜”,用途:“腌制”,年份:“2020”,制造日期:3},
{发酵:“甜菜”,用途:“腌制”,年份:“2018”,制造日期:3},
{发酵:“甜菜”,使用:“发酵”,年份:“2018”,制造:2},
{发酵:“甜菜”,使用:“腌制”,年份:“2019”,制造:4},
{发酵:“甜菜”,使用:“发酵”,年份:“2019”,制造:2},
{发酵:“甜菜”,使用:“腌制”,年份:“2020”,制造:4},
{发酵:“甜菜”,使用:“发酵”,年份:“2020”,制造:1},
];
常量数据={};
发酵。forEach((项目)=>{
if(数据[项目发酵]==未定义){
数据[项目.发酵]={使用:{},年份:{};
}
数据[项目发酵][“使用”]={
…数据[项.发酵][“使用”],
[项目.使用]:true,
};
数据[项目.发酵][“年”][项目.年]=
数据[项目.发酵][“年”][项目.年]==未定义?项目.制造:数据[项目.发酵][“年”][项目.年]+项目.制造;
});
const result={};
Object.key(数据).forEach((key)=>{
结果[键]={
用法:Object.key(数据[key].use),
年份:Object.key(数据[key].year),
made:Object.values(数据[key].year),
};
});

控制台日志(结果)
您可以通过一个
reduce()
调用来实现这一点,通过
发酵
进行分组,检查
年份
并相应地增加
生成的
,最后添加
使用
(如果它不存在)

constbyference=发酵减少((a,o)=>{
让{use,year,made}=(a[o.发酵]?={use:[],year:[],made:[]);
//检查年份,如果存在,访问made和increment中的相同索引。
设yearIndex=year.indexOf(o.year);
如果(年份索引!==-1){
制造[年度指数]+=o.made;
}否则{
年推送(o年);
制造。推动(o.制造);
}
//如果它不存在,请添加use。
如果(!use.包括(o.use))使用推送(o.use);
返回a;
}, {});
控制台日志(byFerment)

常数发酵=[
{“发酵”:“卷心菜”,“用途”:“酸菜”,“年份”:“2018”,“制造”:2},
{“发酵”:“白菜”,“用途”:“腌制”,“年份”:“2018”,“制造”:1},
{“发酵”:“卷心菜”,“用途”:“酸菜”,“年份”:“2019”,“制造”:2},
{“发酵”:“卷心菜”,“用途”:“腌制”,“年份”:“2019”,“制造”:1},
{“发酵”:“白菜”,“用途”:“腌制”,“年份”:“2020”,“制造”:3},
{“发酵”:“甜菜”,“用途”:“腌制”,“年份”:“2018”,“制造”:3},
{“发酵”:“甜菜”,“用途”:“发酵”,“年份”:“2018”,“制造”:2},
{“发酵”:“甜菜”,“用途”:“腌制”,“年份”:“2019”,“制造”:4},
{“发酵”:“甜菜”,“用途”:“发酵”,“年份”:“2019”,“制造”:2},
{“发酵”:“甜菜”,“用途”:“腌制”,“年份”:“2020”,“制造”:4},
{“发酵”:“甜菜”,“用途”:“发酵”,“年份”:“2020”,“制造”:1}
];

根据
发酵
值对数组项进行分组。使用
\uuu.mapValues()
迭代组。合并每个组,并根据合并的
键添加或合并项目。若要连接,请使用连接并保持唯一性的
\uuu.union()
。使用
\uU4.omit()
从合并的组对象中删除
发酵

const fn=arr=>{
//通过“发酵”值创建组
const groups=u.groupBy(arr,'发酵');
返回映射值(组,
group=>\uU4.omit(//从合并的组中删除发酵
//合并每组
_.mergeWith({},…组,(o1,o2,键)=>{
//添加生成的值