Javascript 使用.reduce查找序列中缺少的数字

Javascript 使用.reduce查找序列中缺少的数字,javascript,Javascript,输出应该是4,想知道是否可以使用reduce或函数(不是通过循环)?仅当缺少的值在数组的最后一个值之前时,它才起作用 可以使用起始值并检查上一个元素和实际元素 var o=[1,2,3,5,6,7,8], res=o.reduce(函数(r,a,i,aa){ return!i | | r!==未定义的| | aa[i-1]+1==a?r:aa[i-1]+1; },未定义); 控制台日志(res)您可以使用reduce计算所有元素的实际总和,然后从目标总和中减去它(n(a0+an)/2)。这会给

输出应该是4,想知道是否可以使用reduce或函数(不是通过循环)?仅当缺少的值在数组的最后一个值之前时,它才起作用

可以使用起始值并检查上一个元素和实际元素

var o=[1,2,3,5,6,7,8],
res=o.reduce(函数(r,a,i,aa){
return!i | | r!==未定义的| | aa[i-1]+1==a?r:aa[i-1]+1;
},未定义);

控制台日志(res)
您可以使用
reduce
计算所有元素的实际总和,然后从目标总和中减去它(
n(a0+an)/2
)。这会给你丢失的号码

var o=[1,2,3,5,6,7,8];
var len=o.长度;
var总和=(len+1)*(o[0]+o[len-1])/2;
var res=总和-o.reduce((x,y)=>x+y);

控制台日志(res)
而不是
reduce
,您可以使用
find
,一旦找到缺少的值,它将不再查找:

const o=[1,2,3,5,6,7,8];
常数res=o.find((x,i)=>o[i+1]-x>1)+1;

console.log(res)//4
您可以为此使用each,下面的命令适用于您指定的任何序列间隔-如果所有元素按顺序排列,则返回-1,或者不适合的元素返回-1:

var o=[1,4,7,10,11]
var-seqInterval=3;
函数getMissing(arr,间隔){
var-hit=-1;
var res=每个(函数(e,i){
命中率=i==0?命中率:((e-间隔)==arr[i-1]?-1:e);
回击==-1;
});
回击;
}
日志(getMissing(o,seqInterval));
var o1=[1,2,3,5,6,7,8];
变量seqInterval1=1;

日志(getMissing(o1,seqInterval1))为了简洁起见,这里有一个使用Array.reduce和ES6 arrow函数的简单解决方案

const o=[1,2,3,5,6,7,8];
常数结果=o.reduce((x,y)=>y>x?x:y+1,1)

控制台日志(结果)概括这些工作总是好的。因此,您应该为算法提供一个序列描述符函数,以查找序列中缺少的项。让我们做吧

函数findmisingItem(a,s){
返回s(a[a.findIndex((f,i,a)=>i?f!==s(a[i-1]):false)-1]);
}
var data1=[1,2,3,5,6,7,8],
数据2=[1,4,9,16,36,49,64,81],
系列1=n=>n+1,
series2=n=>Math.pow(Math.sqrt(n)+1,2);
res1=FindAdminSignItem(数据1,系列1),
res2=findminitem(数据2,系列2);
控制台日志(res1);

console.log(res2)为什么输出应该是4?因为这是这个数组中缺少的数字,如果你按1迭代它,直到8
reduce
遍历所有元素;它不会停止。如果返回
“Nothing”
,减法结果将是
“Nothing”-x
,其中
x
是一个数字。请改为使用
find
“仅当缺少的值在数组的最后一个值之前时,它才起作用。” — 这就像说一个坏了的时钟一天只显示两次正确的时间。@Xufox我使用reduce是因为我认为从数组中获取一个值是有用的,我没有试着去检查。聪明而优雅!我喜欢@Kinduser对我来说,这个问题听起来像是一个例子……使用
reduce
可以做到这一点,但这并不意味着没有更好的方法可以做到这一点。这个答案绝对令人惊讶。谢谢你的发帖!真是天才!
var o = [1,2,3,5,6,7,8]

var res = o.reduce(function(x,y){

   return !((y-x)===1)?y-1:'Nothing'

})
console.log(res)//7