Переформирование многомерного массива

я с бека передаю себе данные на фронт. Получаю массив с массивами [Array(7), Array(7), Array(7), и т.д.

внутри массив лежит такого вида [id, name, error1 , error2, error3, comment, 1].

мне для таблицы нужны эти данные. Так как имя может повторятся, а мне надо объединить строку я циклом перебираю массив и ищу там с тем же именем и если нахожу, то формирую массив [{content : name, rowspan: n}, error1,error2,error3, comment, 1],[ error1,error2,error3, comment, 1] и так далее.

let uniqueNames = [...new Set(info.map(item => item[1]))];
let mergedData = [];
uniqueNames.forEach(name => {
  let rowsWithName = info.filter(item => item[1] === name);
  let rowspan = rowsWithName.length;
  rowsWithName.forEach((item, index) => {
     let row = [];
     if (index === 0) {
        row.push({ content: name, rowSpan: rowspan, styles: {textColor: [0,0,0]}});
     }
     row.push(item[2], item[3], item[4], item[5], item[6]);
     mergedData.push(row);

  });  
});

теперь мне нужно проверять ошибки, то есть у меня может быть error1 3 раза, error2 1 раз и error3 null. Мне нужно получить массив такого вида

[
    [
        { content: 'Имя', rowSpan: 3},
        { content: 'error1', rowSpan: 1},
        { content: 'error2', rowSpan: 3},
        { content: 'Всё ок', rowSpan: 3}
    ],
    [
        { content: 'Error1', rowSpan: 1}
    ],
    [
        { content: 'Erorr1', rowSpan: 1}
    ]
]

Ну то есть мне приходит [name1, error1, error2, null, comment], [name1,error1, null, null, comment] , [name2 ..... и мне нужно что бы от количества этих строк или null формировать rowspan

Пример входящего массива:

[
    [28175, 'УАЗ Буханка 1', 'Потеря данных кол. 1 длительность    0Д   0Ч  42М  39С', null, null, null, 1],
    [28175, 'УАЗ Буханка 1', 'Критически низкое напряжение кол. 6 длительность    0Д   0Ч   0М   5С', null, null, null, 1],
    [28175, 'УАЗ Буханка 1', 'Отключение питания кол. 1 длительность    0Д   2Ч  11М  39С', null, null, null, 1],
    [28175, 'УАЗ Буханка 1', null, 'Отключение ДУТа кол. 1 длительность    0Д   0Ч   0М   1С', null, null, 1],
    [28193, 'УАЗ Буханка 2', 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   0С', null, null, null, 1],
    [29915, 'FAW J6P-390', 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   1С', null, null, null, 1],
    [29933, 'FAW J6P-390', 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   0С', null, null, null, 1],
    [29333, 'Камаз', null, null, 'Слито топливо', null, 1]
]

То что хочу получить

[
    [
        { content: 'УАЗ Буханка 1', rowSpan: 3},
        { content: 'Потеря данных кол. 1 длительность    0Д   0Ч  42М  39С', rowSpan: 1},
        { content: 'Отключение ДУТа кол. 1 длительность    0Д   0Ч   0М   1С', rowSpan: 3},
        { content: 'Ошибок нет', rowSpan: 3}
    ],
    [
        { content: 'Критически низкое напряжение кол. 6 длительность    0Д   0Ч   0М   5С', rowSpan: 1}
    ],
    [
        { content: 'Отключение питания кол. 1 длительность    0Д   2Ч  11М  39С', rowSpan: 1}
    ],
    [
        { content: 'УАЗ Буханка 2', rowSpan: 1},
        { content: 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   0С', rowSpan: 1},
        { content: 'Ошибок нет', rowSpan: 1},
        { content: 'Ошибок нет', rowSpan: 1}
    ],
    [
        { content: 'FAW J6P-390', rowSpan: 2},
        { content: 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   1С', rowSpan: 1},
        { content: 'Ошибок нет', rowSpan: 2}, { content: 'Ошибок нет', rowSpan: 2}
    ],
    [
        { content: 'Критически низкое напряжение кол. 6 длительность    0Д   0Ч   0М   5С', rowSpan: 1}
    ],
    [
        { content: 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   0С', rowSpan: 1}
    ],
    [
        { content: 'Камаз', rowSpan: 1},
        { content: 'Ошибок нет', rowSpan: 1},
        { content: 'Ошибок нет', rowSpan: 1},
        { content: 'Слито топливо', rowSpan: 1}
    ]
]

как это сделать?


Ответы (1 шт):

Автор решения: ksa

То что хочу получить

Предложу нечто вот такое...

Но данные, приведенные автором, могут быть другого "наполнения". Т.ч. не факт что такое подойдет на 100%.

const arr = [
    [28175, 'УАЗ Буханка 1', 'Потеря данных кол. 1 длительность    0Д   0Ч  42М  39С', null, null, null, 1],
    [28175, 'УАЗ Буханка 1', 'Критически низкое напряжение кол. 6 длительность    0Д   0Ч   0М   5С', null, null, null, 1],
    [28175, 'УАЗ Буханка 1', 'Отключение питания кол. 1 длительность    0Д   2Ч  11М  39С', null, null, null, 1],
    [28175, 'УАЗ Буханка 1', null, 'Отключение ДУТа кол. 1 длительность    0Д   0Ч   0М   1С', null, null, 1],
    [28193, 'УАЗ Буханка 2', 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   0С', null, null, null, 1],
    [29915, 'FAW J6P-390', 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   1С', null, null, null, 1],
    [29933, 'FAW J6P-390', 'Критически низкое напряжение кол. 1 длительность    0Д   0Ч   0М   0С', null, null, null, 1],
    [29333, 'Камаз', null, null, 'Слито топливо', null, 1]
]

const m = arr.reduce((m, a) => {
    const v = a[1]
    const ar = m.has(v)? m.get(v): [[], [], []]
    a.slice(2, 5).forEach((v, i) => v && ar[i].push(v))
    m.set(v, ar)
    return m
}, new Map())
const res = m.entries().reduce((ac, [v, a]) => {
    const r = a.reduce((max, a) => Math.max(max, a.length), 1)
    ac.push([
        {content: v, rowSpan: r},
        ...a.map(a => ({
            rowSpan: a.length? r + 1 - a.length: r,
            content: a.shift() || 'Ошибок нет'
        }))
    ])
    while (a = a.filter(a => a.length), a.length) {
        ac.push([
            ...a.map(a => ({
                content: a.shift(),
                rowSpan: 1
            }))
        ])
    }
    return ac
}, [])
console.log(res)

→ Ссылка