Javascript将条件合并行

越南的

我需要合并具有特定条件的行,如下所示:

  • 如果行在col中具有相同的值:0、1、3、4、5,并且col 3等于特定值(例如17007)-> merge并且合并的行具有col 2的总和。
  • 否则,请不要合并。

我已经试过了:

const expect = require('chai').expect

// this function takes an object, check values of all compared columns (a, b, c, d, e) of each row, if there's a match, return a merged row with value col (v) = sum of each old row v
const mergeRows = (obj, v, ...params) => {
    const result = obj.reduce((acc, cur) => {
        const key = params.map(p => {return `${cur[p]}`}).join('|')
        // if the key values don't match
        if (acc[3] === '17007') {
            if(!acc[key]) acc[key] = cur
            // if the key values match
            else acc[key][v] = (+acc[key][v] + +cur[v]).toString()
        }
        else acc[key] = cur;
        return acc
    }, {})

    return Object.values(result)
}

const mergeRowsObj = [
    ['5400-030', '15051', '-77.25', '17001P', 'ARED', 'ABC'],
    ['1250-100', '15051', '230.14', '17001P', 'BGRE', 'DEF'],
    ['5400-030', '15051', '-145.5', '17007', 'CBLU', 'GHI'],
    ['1250-100', '15051', '103', '17007', 'DYEL', 'IJK'],
    ['1250-100', '15051', '-23.4', '17007', 'DYEL', 'IJK'],
    ['5400-030', '15051', '203.5', '17007', 'CBLU', 'GHI'],
    ['5400-032', '15051', '10', '17008', 'CBLU', 'GHI'],
    ['5400-032', '15051', '5', '17008', 'CBLU', 'GHI'],
    ['5400-030', '15051', '125', '17007', 'CBLU', 'GHI']
]
const mergeRowsResultObj = [
    ['5400-030', '15051', '-77.25', '17001P', 'ARED', 'ABC'],
    ['1250-100', '15051', '230.14', '17001P', 'BGRE', 'DEF'],
    ['5400-030', '15051', '183', '17007', 'CBLU', 'GHI'],
    ['1250-100', '15051', '79.6', '17007', 'DYEL', 'IJK'],
    ['5400-032', '15051', '10', '17008', 'CBLU', 'GHI'],
    ['5400-032', '15051', '5', '17008', 'CBLU', 'GHI']
]

const mergeRowsResult = mergeRows(mergeRowsObj, 2, 0, 1, 3, 4, 5)

console.log(mergeRowsResult);

describe('mergeRows', () => {
    it('should return an object with merged rows that contain the same values of specific columns', () => {
        expect(mergeRowsResult).to.deep.equal(mergeRowsResultObj)
    })
})

我也尝试过修改reduce()函数,为第3行的值添加条件,例如:

if(!acc[key] || cur[3] !== '17007') acc[key] = cur

但这仍然行不通。

妮娜·斯科茨(Nina Scholz)

您需要cur代替acc

if (cur[3] === '17007') {
//  ^^^

另一个用于未更改行的唯一键,在这种情况下,我将完整的行作为字符串作为键。

acc[Object.values(cur).join('|')] = cur;
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

const mergeRows = (obj, v, ...params) => {
    const result = obj.reduce((acc, cur) => {
        const key = params.map(p => cur[p]).join('|')
        if (cur[3] === '17007') {
            if(!acc[key]) acc[key] = cur
            else acc[key][v] = (+acc[key][v] + +cur[v]).toString()
        } else {
            acc[Object.values(cur).join('|')] = cur;
        }
        return acc
    }, {})

    return Object.values(result)
}

const mergeRowsObj = [
    ['5400-030', '15051', '-77.25', '17001P', 'ARED', 'ABC'],
    ['1250-100', '15051', '230.14', '17001P', 'BGRE', 'DEF'],
    ['5400-030', '15051', '-145.5', '17007', 'CBLU', 'GHI'],
    ['1250-100', '15051', '103', '17007', 'DYEL', 'IJK'],
    ['1250-100', '15051', '-23.4', '17007', 'DYEL', 'IJK'],
    ['5400-030', '15051', '203.5', '17007', 'CBLU', 'GHI'],
    ['5400-032', '15051', '10', '17008', 'CBLU', 'GHI'],
    ['5400-032', '15051', '5', '17008', 'CBLU', 'GHI'],
    ['5400-030', '15051', '125', '17007', 'CBLU', 'GHI']
]

const mergeRowsResult = mergeRows(mergeRowsObj, 2, 0, 1, 3, 4, 5)

mergeRowsResult.forEach(a => console.log(...a));
.as-console-wrapper { max-height: 100% !important; top: 0; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python使用条件逻辑合并行

来自分类Dev

熊猫满足条件的列合并行

来自分类Dev

如何将并行python与django合并

来自分类Dev

R有条件地合并行

来自分类Dev

通过根据条件合并行来创建表

来自分类Dev

根据多个条件合并行,然后对一列求和

来自分类Dev

如何在将列移动到合并行的同时合并行?

来自分类Dev

JPA CriteriaBuilder将合并条件合并为析取条件

来自分类Dev

熊猫:如何将df与条件合并

来自分类Dev

将多个csv与条件合并时出错

来自分类Dev

如何将kleisli与条件合并

来自分类Dev

将多个 && 条件合并为 1

来自分类Dev

合并行+合并大型数据集的值(将SQL导出转换为多值)

来自分类Dev

在Excel中合并行

来自分类Dev

在MySQL中合并行

来自分类Dev

按组合并行

来自分类Dev

PostgreSQL合并行

来自分类Dev

使用函数合并行

来自分类Dev

我的SQL合并行

来自分类Dev

SQL合并行

来自分类Dev

按组合并行

来自分类Dev

按ID合并行

来自分类Dev

Mysql 折叠/合并行

来自分类Dev

在条件下通过awk / unix中的重复列合并行

来自分类Dev

SQL-根据前一行的值有条件地合并行

来自分类Dev

如何根据 PostgreSQL 中的行差异有条件地合并行?

来自分类Dev

如何在r中有条件地合并行

来自分类Dev

如何将两个javascript函数与具有条件的第三个函数合并?

来自分类Dev

将Pandas数据框合并到数据框列表中,不包括成功与列表中的prevoius表匹配的合并行