根据子数组的位置和数组的第一个元素计算子数组元素的总和

Posted

技术标签:

【中文标题】根据子数组的位置和数组的第一个元素计算子数组元素的总和【英文标题】:Compute sum of elements of sub-arrays based on their position and first element of array 【发布时间】:2019-01-03 06:29:38 【问题描述】:

有一个包含许多子数组的矩阵。每个数组具有相同的长度,并且它们的每个第一个元素都是一个字符串,后跟具有这种形式的数字元素:

myArray = [
        ["revenues", 10, 20, 30],
        ["expenses", 1, 1, 1],
        ["expenses", 2, 3, 4],
        ["revenues", 5, 6, 7],
];

我的目标是通过字符串组合它们并计算每个位置的总和。对于上面的例子,结果必须是:

result = [
        ["revenues", 15, 26, 37],
        ["expenses", 3, 4, 5],
];

我尝试通过将它们映射到字符串的值并计算每个位置的总和来做到这一点。它仅适用于第一阶段包含“收入”但仍然不起作用的子数组字符串。

result = myArray.map(s => s[0].includes("revenues")).reduce(function (r, a) 
        a.forEach(function (b, i) 
            r[i] = (r[i] || 0) + b;
        );
        return r;
    , []);

有什么建议吗?

【问题讨论】:

你尝试使用 json 对象吗?它作为哈希映射工作。你的键是“收入”和“费用”,值是一个对象,1:resultOne,2:resultTwo,3:resultThree 我尝试只使用 map 和 reduce。我也会试试的 【参考方案1】:

您可以在临时结果中找到子数组或将该数组添加到结果集中。

var array = [["revenues", 10, 20, 30], ["expenses", 1, 1, 1], ["expenses", 2, 3, 4], ["revenues", 5, 6, 7]],
    result = array.reduce((r, a) => 
        var sub = r.find(([key]) => key === a[0]);
        if (!sub) 
            return r.concat([a]);
        
        a.forEach((v, i) => i && (sub[i] += v));
        return r;
    , []);
    
console.log(result);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

【参考方案2】:

var myArray = [
    ["revenues", 10, 20, 30],
    ["expenses", 1, 1, 1],
    ["expenses", 2, 3, 4],
    ["revenues", 5, 6, 7],
];

var result = myArray.reduce(function(acc, curr) 

    if (acc[curr[0]]) 
        acc[curr[0]] = acc[curr[0]].map(function(val, index) 

            if (index) 
                return val + curr[index];
            
            return val
        )
     else 
        acc[curr[0]] = curr;
    
    return acc
, )

console.log(Object.values(result))

【讨论】:

以上是关于根据子数组的位置和数组的第一个元素计算子数组元素的总和的主要内容,如果未能解决你的问题,请参考以下文章

基于子数组的第二个元素对多维数组进行排序

计算子数组和最大(动态规划)

Postgres:计算子查询中的唯一数组条目

LeetCode习题——在排序数组中查找元素的第一个和最后一个位置(二分查找)

1536. 在排序数组中查找元素的第一个和最后一个位置

数组元素保持堆叠在数组的第一个位置