告诉我,如何以最佳方式转换字符串,如
const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
到像
这样的数组const range = [
{
min: 1350,
max: 1350,
},
{
min: 1351,
max: 1351,
},
{
min: 1390,
max: 1391,
},
{
min: 1401,
max: 1401,
},
{
min: 1402,
max: 1407,
},
];
换句话说,您需要使用一个字符串创建一个数字范围数组,其中明确指定了这些数字范围。
最明显的可能算法是:
1)使用分隔符,
2)使用命令trim
3)检查部件是否为数字
4)如果没有,则使用分隔符-
5)使用命令trim
,
6)检查组件eq 2的数量,并且它是一个数字
但它是否有可能使其更优化,更美观,更有效?
答案 0 :(得分:5)
您可以使用.split()
和.map()
:
const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
const range = data.split(",").map(s => {
let [min, max = min] = s.split("-");
return {min: Number(min), max: Number(max)}
});
console.log(range);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)
尝试这样的事情:
const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407"
const result = data
.split(/\s*,\s*/)
.map(pair => {
const [min, max = min] = pair
.split(/\s*-\s*/)
.map(Number)
return {
min,
max
}
})
console.log(result)

答案 2 :(得分:1)
您可以将split
方法与reduce
方法结合使用。
reduce()方法对累加器和每个都应用一个函数 数组中的元素(从左到右)将其缩小为单个元素 值。
另外,使用+
运算符以强制结果Number
。
const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
const array = data.split(', ').reduce(function(arr, elem){
var [min, max] = elem.split('-');
arr.push({
min : + min,
max: + (max || min)
});
return arr;
},[]);
console.log(array);

答案 3 :(得分:0)
我认为简单且易于理解的方法是遍历值并检查它们是否具有范围值(带连字符)并相应地为range
数组创建对象。
const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
var range = [];
data.split(',').forEach((val)=>{
var obj = {};
if(val.indexOf('-') === -1 ){
obj.min = val;
obj.max = val;
} else {
obj.min = val.split('-')[0].trim();
obj.max = val.split('-')[1].trim();
}
range.push(obj);
});
console.log(range);
答案 4 :(得分:0)
此代码可以帮助您。
const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
var arr = data.split(',');
const range = [];
for(var i=0; i< arr.length; i++){
var b = arr[i].split('-');
if(!b[1])b[1]=b[0];
var obj = new Object();
obj.min = parseInt(b[0]);
obj.max = parseInt(b[1]);
range.push(obj);
}
console.log(range);