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} Р`)

→ Ссылка