Javascript 如何从数组中提取数字序列?

Javascript 如何从数组中提取数字序列?,javascript,Javascript,我有以下数组: var selectedRange = [ null, null, null, null, null, null, null, null, 9, //sequences 10,//sequences null, 12, 13, 14, null, null, null, null, null, 20, null, null, null, null, 25, null, nu

我有以下数组:

var selectedRange = [
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  null,
  9, //sequences
  10,//sequences
  null,
  12,
  13,
  14,
  null,
  null,
  null,
  null,
  null,
  20,
  null,
  null,
  null,
  null,
  25,
  null,
  null,
  null,
  29,
  30,
  31,
  32,
  null,
  null,
  null,
  null,
  37,
  38,
  null,
  40,
  41,
  42,
  null,
  44,
  null,
  null,
  47,
  null,
  49,
  50,
  null,
  null,
  null,
  null,
  null,
  null
]
我需要提取数字序列,并且只提取数字-因此结果如下:

["9,10", "12,13,14", "20", "25", "29,30,31,32", "44", "47", "49,50"]
问题是,我不能想出一个解决方案来提取一个序列,我想我需要一个递归函数来重复检查最后一个数字和当前值是否在后面的部分-就像这里…(!!prm&&(prm-(index-1)==1)

您可以使用来执行以下操作

var selectedRange=[null、null、null、null、null、null、null、9、10、null、12、13、14、null、null、null、null、null、null、20、null、null、null、null、null、null、25、null、null、null、null、null、null、null、null、29、30、31、32、null、null、null、null、null、37、38、null、40、41、42、null、44、null、null、null、47、null、null、49、50、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null;
设split=null;
常量输出=所选范围减少((acc,cur)=>{
如果(当前){
拆分?拆分+=”,“+cur:split=`${cur}`;
}否则{
如果(拆分){
加速推(分离);
split=null;
}
}
返回acc;
}, []);

console.log(输出);
您可以执行以下操作

var selectedRange=[null、null、null、null、null、null、null、9、10、null、12、13、14、null、null、null、null、null、null、20、null、null、null、null、null、null、25、null、null、null、null、null、null、null、null、29、30、31、32、null、null、null、null、null、37、38、null、40、41、42、null、44、null、null、null、47、null、null、49、50、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null;
让isNullSeq=true;
常数arr=[];
设temp='';
selectedRange.forEach((项目)=>{
如果(项目){
if(isNullSeq){
温度=温度+项目;
isNullSeq=false;
}否则{
温度+=',';
温度+=项目;
}
}否则{
如果(!isNullSeq){
isNullSeq=true;
arr.push(温度);
温度='';
}
}
});

console.log(arr);
您可以迭代该数组并查看前一个数组

让selectedRange=[null,8,null,null,null,9,10,null],
结果=[],
最后;
for(选定范围的常量值){
如果(值===null)继续;
if(last+1===value)result[result.length-1]+=`,${value}`;
else result.push(value.toString());
last=值;
}
console.log(结果);

.as控制台包装{max height:100%!important;top:0;}
如果中间只有空值,那么简单一点怎么样

var selectedRange=[null、null、null、null、null、null、null、9、10、null、12、13、14、null、null、null、null、null、null、20、null、null、null、null、null、null、25、null、null、null、null、null、null、null、null、29、30、31、32、null、null、null、null、null、37、38、null、40、41、42、null、44、null、null、null、47、null、null、49、50、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null

console.log(selectedRange.toString().replace(/,{2,}/g,,,,).split(“,”).filter(函数(el){return el!=”;}))
一个选项是连接到逗号分隔的字符串中,然后拆分空元素。添加最后一个筛选器以删除前导或尾随的空元素。这可能不是最有效的方法

var selectedRange=[null、null、null、null、null、null、null、9、10、null、12、13、14、null、null、null、null、null、null、20、null、null、null、null、null、null、25、null、null、null、null、null、null、null、null、29、30、31、32、null、null、null、null、null、37、38、null、40、41、42、null、44、null、null、null、47、null、null、49、50、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null
console.log(
selectedRange.join(“,”).split(/,+| ^,|,$/).filter(布尔值)

)
我可能会使用
takeWhile
dropWhile
,您可以从Ramda之类的实用程序库中获取它们,也可以自己实现它们

const输入=[
[1,2,空,空,5,6,7,空,空,10,11],
[null,null,3,4,null],
[1,2,空,空,5,空,空],
[null],
[1],
[null,1],
[],
];
const takeWhile=(谓词)=>([head,…tail])=>{
if(head==未定义的| |!谓词(head))返回[];
return[head].concat(takeWhile(谓词)(tail));
}
常量dropWhile=(谓词)=>([head,…tail])=>{
if(head==未定义)返回[];
如果(!谓词(head))返回[head,…tail];
返回dropWhile(谓词)(尾部);
};
常量isNull=x=>x==null;
常量isNotNull=x=>x!==null;
常量序列=(列表)=>{
if(list.length==0)返回[];
if(list[0]==null)返回序列(dropWhile(isNull)(list));
return[takeWhile(isNotNull)(list.join(',)].concat(
序列(dropWhile(isNotNull)(列表))
);
}
console.log(inputs.map(sequence));

作为控制台包装{max height:100%!important;top:0;}
使用
数组创建序列数组的中间数组。减少
并将结果序列映射到字符串

const selectedRange=[null、null、null、null、null、null、null、9、10、null、12、13、14、null、null、null、null、null、null、20、null、null、null、null、null、25、null、null、null、null、null、null、null、null、29、30、31、32、null、null、null、null、null、null、37、38、null、40、41、42、null、44、null、null、null、47、null、null、49、50、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null、null;
//减速器λ
常量sequenceReducer=(acc,val)=>
!val?acc:val-1==acc.flat().pop()?
附件[acc.length-1]。推送(val)和附件:[……附件,[]混凝土(val)];
log(JSON.stringify(selectedRange.reduce(sequenceReducer,[])).map(v=>v.join());
//让我们尝试不连续序列(数字不是连续的)
常量x=[null,8,null,null,null,9,10,null,11,null,null,null,12,null,14,null,15,null,null,null,null,16];
log(JSON.stringify(x.reduce(sequenceReducer,[])).map(v=>v.join());
//序列是不连续的,没有顺序。请先排序
//(顺便说一句,注意负值)
常数y=[26,13,null,8,null,-3,null,9,25,10,null,11,null,7,12,null,14,2,15,null,17,16,1];
常量排序序列=(a,b)=>+a-+b;

console.log(JSON.stringify(y.sort(sortSequenceArray).reduce(sequenceReducer,[]).map(v=>v.join());
通过考虑问题中给出的序列(9,10,…,-seq=diff of
1
)。如下 代码将生成所需的结果-<
let tempArr = [];
$.each(selectedRange, function (index, prm) {
    if (!!prm && (prm - (index - 1) == 1) {
        tempArr.push(prm); // need to loop this section with recursion 
    }
});