(这是一个与前一个问题类似但更复杂的场景)

我有一个数组originalArrayData,如下所示:

originalArrayData = [{
    "16": {
        "id": 22,
        "grid_row_id": 5,
        "grid_col_id": 16,
        "data": "10",
        "created_at": "rertte",
        "error_mgs": null
    },
    "header": "BUTTERFLY HEADER",
    "id": 5
},
{
    "17": {
        "id": 31,
        "grid_row_id": 9,
        "grid_col_id": 16,
        "data": "14",
        "created_at": "rtyhtyjtdyj",
        "error_mgs": null
    },
    "header": "BUTTERFLY HEADER",
    "id": 6
},
{
    "18": {
        "id": 35,
        "grid_row_id": 9,
        "grid_col_id": 12,
        "data": "55",
        "created_at": "thrtuhrs",
        "error_mgs": null
    },
    "header": "PARROT HEADER",
    "id": 6
},
{
    "19": {
        "id": 36,
        "grid_row_id": 9,
        "grid_col_id": 12,
        "data": "31",
        "created_at": "rtyhtyjtdyj",
        "error_mgs": null
    },
    "header": "PARROT HEADER",
    "id": 7
},
{
    "20": {
        "id": 36,
        "grid_row_id": 9,
        "grid_col_id": 14,
        "data": "31",
        "created_at": "rtyhtyjtdyj",
        "error_mgs": null
    },
    "header": "OTHER HEADER",
    "id": 7
}...........

假设我有一个ID数组(这些数字可能是随机的,并不总是2.可能有1、3等数组项)

arrayOfIds: [16 , 12]

如果grid\u col\u id的值存在于arrayOfIds中的任何位置,那么对于具有相同grid\u col\u id的每个对象,如何使用使用"header"值生成的新键创建新数组,并且这些键的值是具有相同grid\u col\u id的所有项的"data"值之和.

目标/预期输出:

100

说明:如果查看originalArrayData中的每个项目(本例中有4个,但可以有很多),前2个项目具有相同的grid\u col\u id和相同的标题.对于这两个变量,"data"="10"和"14",加起来就是24.因此,您有"butterflyheader":24.

同样的逻辑也可以应用于parrotheader.所有新键都是每个对象的原始"标头"的小写和无空格版本.

不包括标题为"其他标题"的项目,因为其grid\u col\u id在arrayOfIds中不存在.

为了解决这个问题,我有以下代码:

        // creates an array of all of the innermost objects in the original array
        let tableDataFiltered = originalArrayData.map(item => 
            Object.values(item).filter(item => typeof item === "object")
        ).flat()

        // Retrieve all items with the relevant grid_col_id
        tableDataFiltered.filter(item => arrayOfIds.includes(item.grid_col_id))

        // Headers to use as keys
        let headersAsKeys = tableDataFiltered.forEach(item => {
            item.header.toLowerCase().split(' ').join(''))
        })

        Object.values(tableDataFiltered.reduce((acc, curr) => {
            acc[curr.category] = 'None';
            headersAsKeys.forEach(key => {
                acc[curr.category][key] += curr[key];
            })
            return acc;
        }, {}));

但是,它会生成HeaderSaskey.forEach不是一个函数.

如何实现目标数组=&燃气轮机;

100

推荐答案

可以将Array#reduce与对象一起使用,以存储每个标头的数据.

const arr=[{"16":{id:22,grid_row_id:5,grid_col_id:16,data:"10",created_at:"rertte",error_mgs:null},header:"BUTTERFLY HEADER",id:5},{"17":{id:31,grid_row_id:9,grid_col_id:16,data:"14",created_at:"rtyhtyjtdyj",error_mgs:null},header:"BUTTERFLY HEADER",id:6},{"18":{id:35,grid_row_id:9,grid_col_id:12,data:"55",created_at:"thrtuhrs",error_mgs:null},header:"PARROT HEADER",id:6},{"19":{id:36,grid_row_id:9,grid_col_id:12,data:"31",created_at:"rtyhtyjtdyj",error_mgs:null},header:"PARROT HEADER",id:7},{"20":{id:36,grid_row_id:9,grid_col_id:14,data:"31",created_at:"rtyhtyjtdyj",error_mgs:null},header:"OTHER HEADER",id:7}];
const ids = [16 , 12];
let res = [arr.reduce((acc, {header,id,...rest})=>{
  let [{grid_col_id, data}] = Object.values(rest);
  header = header.toLowerCase().replaceAll(' ', '');
  if(ids.includes(grid_col_id)) 
    acc[header] = (acc[header] || 0) + +data;
  return acc;
}, {category: "None"})];
console.log(res);

Javascript相关问答推荐

react/redux中的formData在expressjs中返回未定义的req.params.id

使用JavaScript重新排序行

PrivateRoute不是路由组件错误

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

将本机导航路由react 到导航栏中未列出的屏幕?

无法访问Vue 3深度监视器中对象数组的特定对象值'

如何通过将实例方法的名称传递给具有正确类型的参数的继承方法来调用实例方法?

当代码另有说明时,随机放置的圆圈有时会从画布上消失

删除加载页面时不存在的元素(JavaScript)

将范围 Select 器添加到HighChart面积图

重新呈现-react -筛选数据过多

P5JS-绘制不重叠的圆

如何使用Reaction路由导航测试挂钩?

在传单的图像覆盖中重新着色特定 colored颜色 的所有像素

无法向甜甜圈图表上的ChartJSImage添加可见标签

将Windows XP转换为原始数据以在html前端中显示

react :图表负片区域不同 colored颜色

:host::ng-Deep不将样式应用于material 复选框

如何在父IF条件和单个IF条件中形成嵌套的三元语句

在两个数组范围中输入日期范围