Javascript 更改对象结构

Javascript 更改对象结构,javascript,arrays,Javascript,Arrays,我有一个对象数组: const res = [ { KIND_ID: 2229, NAME: "Group", SKU_ID: 311, ARTICLE_NAME: "Product one", WEEK: 202027, FORECAST: 81928.37, PROMO: 0, SALES: 92848, SAFETY_STOCK: 57704.79, STORES_C

我有一个对象数组:

const res = [
  {
    KIND_ID: 2229,
    NAME: "Group",
    SKU_ID: 311,
    ARTICLE_NAME: "Product one",
    WEEK: 202027,
    FORECAST: 81928.37,
    PROMO: 0,
    SALES: 92848,
    SAFETY_STOCK: 57704.79,
    STORES_COUNT: 132,
    ADD_FCST: null
  },
  {
    KIND_ID: 2229,
    NAME: "Group",
    SKU_ID: 311,
    ARTICLE_NAME: "Product one",
    WEEK: 202028,
    FORECAST: 84278.85,
    PROMO: 0,
    SALES: null,
    SAFETY_STOCK: 64000.39,
    STORES_COUNT: 144,
    ADD_FCST: null
  },
  {
    KIND_ID: 2229,
    NAME: "Group",
    SKU_ID: 316,
    ARTICLE_NAME: "Product two",
    WEEK: 202027,
    FORECAST: 89112.97,
    PROMO: 0,
    SALES: 98007,
    SAFETY_STOCK: 59509.31,
    STORES_COUNT: 142,
    ADD_FCST: null
  },
  {
    KIND_ID: 2229,
    NAME: "Group",
    SKU_ID: 316,
    ARTICLE_NAME: "Product two",
    WEEK: 202028,
    FORECAST: 85129.4,
    PROMO: 0,
    SALES: null,
    SAFETY_STOCK: 63409.61,
    STORES_COUNT: 144,
    ADD_FCST: null
  }
];
我想在几周内对一些字段进行分组,例如:

const expected = [
  {
    KIND_ID: 2229,
    NAME: "Group",
    SKU_ID: 311,
    ARTICLE_NAME: "Product one",
    FORECAST: [{ 202026: 97555.64 }, { 202027: 98336.45 }],
    PROMO: [{ 202026: 0 }, { 202027: 0 }],
    SALES: [{ 202026: 95911.77 }, { 202027: null }],
    SAFETY_STOCK: [{ 202026: 63622.28 }, { 202027: 72852.62 }],
    STORES_COUNT: [{ 202026: 135 }, { 202027: 143 }],
    ADD_FCST: [{ 202026: null }, { 202027: null }]
  },
  {
    KIND_ID: 2229,
    NAME: "Group",
    SKU_ID: 316,
    ARTICLE_NAME: "Product two",
    FORECAST: [{ 202026: 104125.69 }, { 202027: 101147.07 }],
    PROMO: [{ 202026: 0 }, { 202027: 0 }],
    SALES: [{ 202026: 102281 }, { 202027: null }],
    SAFETY_STOCK: [{ 202026: 53709.55 }, { 202027: 60675.26 }],
    STORES_COUNT: [{ 202026: 143 }, { 202027: 144 }],
    ADD_FCST: [{ 202026: null }, { 202027: null }]
  }
];
如果有帮助,我需要对周数组和值进行分组:

const weeks = [202027, 202028];
const keys = ['FORECAST','PROMO','SALES','SAFETY_STOCK','STORES_COUNT','ADD_FCST'];
我试图用reduce和下划线方法groupBy来解决这个问题,但这没有帮助。如何将此res数组分组到预期值


虚拟文本,因为:看起来你的文章大部分是代码;请添加更多详细信息。但这就是我想告诉大家的

我试图用reduce解决的问题

这就是我要使用的,虽然有几个步骤,因为这不是一个经典的分组示意图

下面是一个例子

const res=[{KIND_ID:2229,NAME:“Group”,SKU_ID:311,ARTICLE_NAME:“Product one”,周数:202027,预测:81928.37,促销:0,销售额:92848,安全库存:57704.79,门店数量:132,ADD_FCST:null},{KIND_ID:2229,NAME:“Group”,SKU ID:311,ARTICLE_NAME:“Product one”周:202028,预测:84278.85,促销:0,销售:空,安全库存:64000.39,门店数量:144,添加数量:空,{种类ID:2229,名称:“集团”,SKU ID:316,商品名称:“产品二”,周:202027,预测:89112.97,促销:0,销售:98007,安全库存:59509.31,门店数量:142,添加数量:空,{种类ID:2229,名称:“集团”,SKU ID:316,商品名称:“产品二”,周数:202028,预测:85129.4,促销:0,销售:空,安全库存:63409.61,门店数量:144,添加(FCST:空)};
常量grpFields=[“预测”、“促销”、“销售”、“安全库存”,
“存储计数”、“添加计数”];
常数o=res.reduce((a,v)=>{
const{KIND\u ID,NAME,SKU\u ID,ARTICLE\u NAME}=v;
设f=a.find(f=>f.SKU\u ID==v.SKU\u ID);
如果(!f){
f={KIND\u ID,NAME,SKU\u ID,ARTICLE\u NAME};
forEach(k=>f[k]=[]);
a、 推(f);
}
forEach(k=>f[k].push({[v.WEEK]:v[k]}));
返回a;
},[]);

控制台日志(o)请详细说明用于获得预期输出的方法。能改善这个问题的是简单性。这能回答你的问题吗?如何使这个“o”函数更灵活,而不需要硬编码变量“种类ID、名称、SKU ID、文章名称”?例如,我想用其他字段修改res数组,但按grpFields分组。@Denis更新为包含通用版本。