【问题标题】:How does one merge and compute array items within a nested array structure via a fixed condition/rule如何通过固定条件/规则合并和计算嵌套数组结构中的数组项
【发布时间】:2020-10-07 06:45:50
【问题描述】:

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

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

输出将是:

let ans = [["B", "A", 4528.33],["C", "B", 221.65],["B", "D", 183.33],["E", "B", 150]]

子数组["B","A", 4528.33]由减法组成,即4900-221.67-150

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

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

【问题讨论】:

  • SO 不是免费的代码服务。请至少包含您为解决此问题所做的尝试。
  • 加减值有什么条件?前两个值的顺序?
  • @NinaScholz 我正在尝试模拟 splitwise / kitty split,因此对于 2 个用户之间的更多交易,我想添加他们的金额并在找到反向匹配时执行减法操作
  • @Shivashankar Nina 想说的是,“AB”和“BA”——>“AB”首先在数组中找到,所以根据你的解释,“BA”将是减号运算,什么会导致 221.67-4900,毕竟是负面结果。但是您的输出希望 4528.33 为正数。什么使 4528.33 在这里是积极的而不是 -4528.33
  • @MoxxiManagarm 假设考虑是否有任何组合说如果“BA”结果为负,那么我们需要更改顺序(反向)并将其存储为“AB”,结果为正。这意味着对于我们在执行此操作时遇到的每个负值,我们需要反转顺序并将数量(数字)存储为正数。

标签: javascript arrays data-structures merge reduce


【解决方案1】:

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

如果值为负,则更改键并取正值。

let data = [["A", "B", 221.67], ["C", "B", 221.65], ["B", "D", 183.33], ["B", "A", 4900], ["E", "B", 150], ["A", "B", 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, b, v];
        }
        return r;
    }, {}));

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2016-06-24
    • 2018-08-15
    • 1970-01-01
    • 2013-01-19
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多