Regexp на извлечение подстроки
На входе дан массив с тремя элементами строками.
const res = ['<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">2</SPAN>',
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">302</SPAN>',
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">2 037</SPAN>'
]
На выходе нужно чтобы получилась строка: 'Итого заказов 2 на сумму 2339 Р
const result = `Итого заказов ${res[0].match(/(>|<)\s?\d+(\/\d+)?/g).map(s => s.replace(/[^\d/]|\/$/g, ''))
на сумму ${Number(res[1].match(/(>|<)\s?\d+(\/\d+)?/g).map(s => s.replace(/[^\d/]|\/$/g, '')))
+ Number(res[2].match(/(>|<)\s?\d+(\/\d+)?/g).map(s => s.replace(/[^\d/]|\/$/g, '')))}`
Как написать корректное решение?
Ответы (2 шт):
Автор решения: Алексей Шиманский
→ Ссылка
const res = ['<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">2</SPAN>',
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">302</SPAN>',
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">2 037</SPAN>'
];
let map = res.map(el => {
const parser = new DOMParser();
const value = new DOMParser().parseFromString(el, 'text/html').querySelector('span').textContent;
return Number(value.replaceAll(' ', ''));
});
let sum = map.reduce((acc, el) => acc += el, 0);
const res = ['<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">2</SPAN>',
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">302</SPAN>',
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">2 037</SPAN>'
];
let map = res.map(el => {
let t1 = el.replace('</SPAN>', '');
return Number(t1.substring(t1.lastIndexOf('>') + 1).replaceAll(' ', ''));
});
let sum = map.reduce((acc, el) => acc += el, 0);
В общем, суть ясна. Допилить под себя не составляет труда (посчитать count и удалить одно значение из массива, если нужно)
Автор решения: Qwertiy
→ Ссылка
var data = [
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">2</SPAN>',
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">302</SPAN>',
'<TD CLASS="R8C1"><SPAN STYLE="white-space:nowrap;max-width:0px;">2 037</SPAN>',
]
var [n, ...p] = data.map(x => +String(x.match(/[\s\d]+(?=<\/SPAN>)/)).replace(/\s/g, ''))
if (p.length !== n) throw new Error('Invalid count')
var sum = p.reduce((r, x) => r+x, 0)
console.log(`Итого заказов ${n} на сумму ${sum} Р`)