在数组中查找字符并将其替换为新值

Find charater in array and replace this with new values

本文关键字:替换 新值 数组 查找 字符      更新时间:2023-09-26

处理一个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]

如果输入可以更改为

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()

您需要遍历数组并检查每个元素,看看它是数字还是范围:

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]);
        }
    }

FIDDLE

假设您可以将元素作为字符串,则可以使用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;
}, []);

演示

使用javascriptsplice()函数查看以下示例:

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);
        }
    }
}

希望这能有所帮助。

元素必须是字符串

//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>

(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);
})();
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;
}