在不使用regex的情况下,有没有一种方法可以在JavaScript中从字符串中获取number?
例如,如果输入是"id is 12345",那么我希望输出中有12345数字。我知道很多正则表达式的解决方案,但我正在寻找一个非正则表达式整洁的解决方案。
"id is 12345"
12345
nhaq1z211#
迭代字符并检查它们是否在一组数字中:
const str = 'id is 12345 or 54321';const set = new Set([...'0123456789']);const nums = [];let start = -1;for (let i = 0; i <= str.length; i++) { const c = str[i]; if (set.has(c)) { if(start === -1 ){ start = i; } } else { start > -1 && nums.push(+str.slice(start, i)); start = -1; }}console.log(nums);
const str = 'id is 12345 or 54321';
const set = new Set([...'0123456789']);
const nums = [];
let start = -1;
for (let i = 0; i <= str.length; i++) {
const c = str[i];
if (set.has(c)) {
if(start === -1 ){
start = i;
}
} else {
start > -1 && nums.push(+str.slice(start, i));
start = -1;
console.log(nums);
字符串如果你想要最快的解决方案,请使用Unemitted的c >= '0' && c <= '9'和String::slice():
c >= '0' && c <= '9'
String::slice()
的数据
<script benchmark data-count="1">const str = "abc def 12345 xyz 987".repeat(1000000);// @benchmark Unmitigated{ let res = [], curr = ''; for (const c of str + ' ') { if (c >= '0' && c <= '9') // add || c === '-' (to handle negatives) curr += c; else if (curr) res.push(+curr), curr = ''; // use BigInt(curr) to handle larger numbers } res}// @benchmark Alexander{ const set = new Set([...'0123456789']); const nums = []; let start = -1; for (let i = 0; i <= str.length; i++) { const c = str[i]; if (set.has(c)) { if(start === -1 ){ start = i; } } else { start > -1 && nums.push(+str.slice(start, i)); start = -1; } } nums}// @benchmark Unmitigated + String::slice(){ let res = [], start = -1; for (let i = 0; i <= str.length; i++) { const c = str[i]; if (c >= '0' && c <= '9') { if(start === -1 ){ start = i; } } else { start > -1 && res.push(+str.slice(start, i)); start = -1; } } res}</script><script src="https://cdn.jsdelivr.net/gh/silentmantra/benchmark/loader.js"></script>
<script benchmark data-count="1">
const str = "abc def 12345 xyz 987".repeat(1000000);
// @benchmark Unmitigated
{
let res = [], curr = '';
for (const c of str + ' ') {
if (c >= '0' && c <= '9') // add || c === '-' (to handle negatives)
curr += c;
else if (curr)
res.push(+curr), curr = '';
// use BigInt(curr) to handle larger numbers
res
// @benchmark Alexander
nums
// @benchmark Unmitigated + String::slice()
let res = [], start = -1;
if (c >= '0' && c <= '9') {
start > -1 && res.push(+str.slice(start, i));
</script>
<script src="https://cdn.jsdelivr.net/gh/silentmantra/benchmark/loader.js"></script>
型
olmpazwi2#
您可以循环遍历所有字符,并从连续的数字中构建数字。这里有一个解决方案,适用于多个数字(仅使用字符0-9形成)。
const str = "abc def 12345 xyz 987";let res = [], curr = '';for (const c of str + ' ') { if (c >= '0' && c <= '9') // add || c === '-' (to handle negatives) curr += c; else if (curr) res.push(+curr), curr = ''; // use BigInt(curr) to handle larger numbers}console.log(res);
const str = "abc def 12345 xyz 987";
console.log(res);
字符串
2条答案
按热度按时间nhaq1z211#
迭代字符并检查它们是否在一组数字中:
字符串
如果你想要最快的解决方案,请使用Unemitted的
c >= '0' && c <= '9'
和String::slice()
:的数据
型
olmpazwi2#
您可以循环遍历所有字符,并从连续的数字中构建数字。
这里有一个解决方案,适用于多个数字(仅使用字符0-9形成)。
字符串