使用javascript片段将自定义类广告到所选行。
带有:字符的值是一个范围,需要替换为值/范围内的所有数字。
//array
var rows = [2,5,50,55:60,74,80:84];
//looking for solution
var rows = [2,5,50,55,56,57,58,59,60,74,80,81,82,83,84]
答案 0 :(得分:0)
假设您可以将元素作为字符串,则可以使用reduce
。此代码生成一个整数数组。
var out = rows.reduce(function (p, c) {
if (c.indexOf('-') > -1) {
var range = c.split('-');
for (var i = range[0], l = range[1]; i <= l; i++) {
p.push(+i);
}
} else {
p.push(+c);
}
return p;
}, []);
答案 1 :(得分:0)
如果输入可以更改为
var rows = ['2','5','50','55-60','74','80-84'];
可能的解决方案是
var result = [];
rows.forEach(function(item){
if(!isNaN(parseFloat(item)) && isFinite(item)){
result.push(parseFloat(item));
}
else{
var splitedItem = item.split('-');
for (var i = splitedItem[0] ; i <= splitedItem[1]; i++){
result.push(parseFloat(i));
}
}
});
结果输出
[2, 5, 50, 55, 56, 57, 58, 59, 60, 74, 80, 81, 82, 83, 84]
修改强>
您输入的输入可以使用parseInt()而不是parseFloat()
答案 2 :(得分:0)
您需要遍历数组并检查每个元素以查看它是数字还是范围:
rows = [2,5,50,'55-60',74,'80-84'];
var newRows=new Array();
for (var i in rows)
{
if (matches = rows[i].toString().match(/^(\d+)\-(\d+)$/)) //use regexp to check ranges
{
for (var j=parseInt(matches[1]);j<=parseInt(matches[2]);j++)
newRows.push(j);
}else{
newRows.push(rows[i]);
}
}
答案 3 :(得分:0)
使用javascript splice() 功能查看以下示例:
var rows = [2,5,50,'55-60',74,'80-84'];
for(var i = 0 ; i < rows.length ; i++){
if( isNaN(rows[i]) )
{
var interval_array = rows[i].split('-');
var interval = parseInt( interval_array[1] ) - parseInt( interval_array[0] );
rows.splice(i, 1); //remove the string item example '55-60'
for(var j = 0 ; j <= (interval+1) ; j++)
{
rows.splice(i+j, 0, parseInt( interval_array[0] )+j);
}
}
}
希望这有帮助。
答案 4 :(得分:0)
元素必须是字符串
//array
var rows = ["2","5","50","55-60","74","80-84"];
var result = [];
rows.forEach(function(l){
var parts = l.split("-");
if(parts.length>1){
for(var i = parts[0] ; i<= parts[1] ; i++){
result.push(parseInt(i));
}
}else{
result.push(parseInt(parts[0]));
}
});
document.getElementById("result").innerHTML = "<pre>"+result+"</pre>";
<div id="result"></div>
答案 5 :(得分:0)
(function() {
var originalSelection = [2, 5, 50, "55-60", 74, "80-84"];
var RANGE_SEPERATOR = "-";
var inclusive = true;
var parsedSelection = [];
for(var i = 0; i < originalSelection.length; i++) {
if(typeof originalSelection[i] == "string") {
// This is a range
var range = originalSelection[i].split(RANGE_SEPERATOR);
// Some quick validation - must be an actual range with 2 numbers, and the smaller needs to be first
if(!(range.length == 2 || range[0] < range[1])) {
console.error(originalSelection[i], 'is not a valid range');
continue;
}
range[0] = parseInt(range[0], 10);
range[1] = parseInt(range[1], 10);
var start = (inclusive ? range[0] : range[0] + 1);
var end = (inclusive ? range[1] : range[1] - 1);
// Another quick validation
if(start > end) {
console.error(originalSelection[i], 'is not a valid range when inclusive =', inclusive);
continue;
}
for(var j = start; j <= end; j++) {
parsedSelection.push(j);
}
} else {
parsedSelection.push(originalSelection[i]);
}
}
// To show this, I'll create a list and add a class when it's in range
var list = document.createElement('ol');
for(var i = 0; i < Math.max.apply( Math, parsedSelection ) + 1; i++) {
var item = document.createElement('li');
// To test if a number is in range, now you can simply use "indexOf"
// Adding one to the index because li's are 1-indexed, not zero
if(parsedSelection.indexOf((i + 1)) >= 0) {
item.className = "selected";
}
list.appendChild(item);
}
console.log(list);
document.getElementsByTagName('body')[0].appendChild(list);
})();
&#13;
body {
font-family: sans-serif;
}
ol {
padding: 0;
margin: 0;
counter-reset: styled-counter;
}
li {
display: inline-block;
width: 50px;
height: 50px;
background: #ccc;
border: 1px solid #000;
text-align: center;
line-height: 50px;
margin: 5px;
}
li:before {
content: counter(styled-counter);
counter-increment: styled-counter;
}
li.selected {
background: #000;
color: #fff;
}
&#13;