如何通过固定条件/规则合并和计算嵌套数组结构中的数组项

问题描述

我有一个JavaScript异构数组,看起来像:

let bigArray = [["A","B",221.67],["C",221.65],["B","D",183.33],"A",4900],["E",150],["A",150]] 现在我想添加第三个元素(数字),如果第一个和第二个元素与下一个数组(在多维数组中)的第一个和第二个元素匹配,然后添加两个数组的第三个元素(数字),并且如果反向则执行减号运算找到了那些匹配的元素。

输出将是:

let ans = [["B",4528.33],150]]

子数组[“ B”,“ A”,4528.33]是通过执行减号运算形成的,即4900-221.67-150

在bigArray中,具有重复元素对的数组,例如“ A”和“ B”(在单个子数组中)。因此,对于所有匹配的子数组,执行求和运算;如果找到与该匹配的子数组相反的数组,则执行减号运算。 i,e => 4900-221.67-150

我尝试了许多方法,但是在所有情况下都无法获得所需的输出。任何帮助将不胜感激,谢谢

解决方法

您可以对已排序的键进行分组以维护标准键,并检查部件键是否具有相同的顺序,然后将值相加或相减。

如果值为负,请更改键并取一个正值。

let data = [["A","B",221.67],["C",221.65],["B","D",183.33],"A",4900],["E",150],["A",150]],result = Object.values(data.reduce((r,[a,b,v]) => {
        const key = [a,b].sort().join('|');
        if (r[key]) {
            r[key][2] += a === r[key][0] ? v : -v;
            if (r[key][2] < 0) r[key] = [r[key][1],r[key][0],-r[key][2]];
        } else {
            r[key] = [a,v];
        }
        return r;
    },{}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }