Переформирование многомерного массива
я с бека передаю себе данные на фронт. Получаю массив с массивами [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 шт):
То что хочу получить
Предложу нечто вот такое...
Но данные, приведенные автором, могут быть другого "наполнения". Т.ч. не факт что такое подойдет на 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)