Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本的Javascript数组函数,问题是已知的,但我无法找到解决方案_Javascript_Arrays_Higher Order Functions - Fatal编程技术网

基本的Javascript数组函数,问题是已知的,但我无法找到解决方案

基本的Javascript数组函数,问题是已知的,但我无法找到解决方案,javascript,arrays,higher-order-functions,Javascript,Arrays,Higher Order Functions,在下面的函数中,我试图获得类似以下内容的输出: [1,1,1,1],[2,2,2],4,5,10,[20,20],391392591] 我可以看出,我嵌入的问题是,我总是将临时数组与push一起添加到函数return中,因此,除了for each函数中的最后一个数字之外,所有单独的数字都与array对象一起被推到目标数组中 我觉得我需要进一步的条件检查,但就我的一生而言,我无法想出有效的解决方案 如有任何建议,将不胜感激 const sortme = (unsortedArr)=> {

在下面的函数中,我试图获得类似以下内容的输出:

[1,1,1,1],[2,2,2],4,5,10,[20,20],391392591]

我可以看出,我嵌入的问题是,我总是将临时数组与push一起添加到函数return中,因此,除了for each函数中的最后一个数字之外,所有单独的数字都与array对象一起被推到目标数组中

我觉得我需要进一步的条件检查,但就我的一生而言,我无法想出有效的解决方案

如有任何建议,将不胜感激

const sortme = (unsortedArr)=> {

let tempArr = []; 

let outputArr = []; 

const reorderedArr = unsortedArr.sort((a,b) => a-b); 

reorderedArr.forEach((number, i) => {

    if ((i === 0) || (reorderedArr[i] === reorderedArr[i-1])) {
    tempArr.push(number);  
    }

    else {     
    outputArr.push(tempArr);
    tempArr = [];
    tempArr.push(number); 
}  
})

outputArr.push(tempArr[0]);
    return outputArr; 
}

const unsortedArr = [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20]; 

sortme(unsortedArr); 

我将创建一个重复数据消除的副本,并
.map()
将其转换为数组,其中包含使用
获取的原始(排序)数组中的值。forEach

const unsortedar=[1,2,4,591,392,391,2,5,10,2,1,1,1,20,20];
常数排序=(arr)=>{
arr=arr.sort((a,b)=>a-b);
//消除阵列重复数据的快捷方法
//结果:1,2,4,5,10,20,391,392,591
让重复数据消除=[…新集(arr)];
让tmpArr;
返回dedupe.map(e=>{
tmpArr=[];//每次迭代时清空tmpArr
//对于重复数据消除阵列的每个元素,在原始元素中查找匹配元素并将其推入tmpArr
arr.forEach(a=>{
如果(a==e)
tmpArr.push(e);
})
如果(tmpArr.length==1)
返回tmpArr[0];//如果有[4],只需返回4
其他的
返回tmpArr;//如果有[1,1,1,1]
//上述if/else的简写
//返回tmpArr.length==1?tmpArr[0]:tmpArr;
});
}
常量结果=排序(未排序);
控制台日志(结果)这应该有效(使用reduce):


常量unsortedar=[1,2,4591392391,2,5,10,2,1,1,1,20,20];
让lastValue=null;
var newArr=unsortedar.sort((a,b)=>a-b)。reduce((acc,value)=>{
如果(acc.length==0 | |((acc.length>0 | |!acc[acc.length-1].length)&&lastValue!==value)){
acc.push(值);
}否则如果(acc.length>0&&lastValue==value){
acc[acc.length-1]=(acc[acc.length-1]。长度?acc[acc.length-1]。concat([value]):[value,value]);
} 
lastValue=值;
返回acc;
}, []);

控制台日志(newArr)和另一种方法,只是为了好玩:

const unsortedar=[1,2,4591392391,2,5,10,2,1,1,20,20];
var arr=unsortedar.sort((a,b)=>a-b)。reduce((acc,value)=>{
如果(acc.length>0&&acc[acc.length-1]。包括(值)){
acc[acc.length-1]。推送(值);
}否则{
附件推送([值])
}
返回acc;
}图((v)=>v.length>1?v:v[0]);

控制台日志(arr)我希望下面的代码非常简单

功能查找名称(pos、分拣机){
用于(设i=pos;ia-b)
//[ 1, 1, 1, 1, 2, 2, 2, 4, 5, 10, 20, 20, 391, 392, 591 ]
让结果=[]
for(设i=0;i1?结果推送(arr):结果推送(…arr)
}
返回结果
}
控制台日志(ClubsamenNumber([1,2,4591392391,2,5,10,2,1,1,1,20,20]))

//[[1,1,1,1],[2,2,2],4,5,10,[20,20],391,392,591]
这似乎很酷,我正在努力理解它到底是如何运作的,但我会进一步研究,地图是我理想中要使用的,但是你的解决方案让我非常困惑,noob眼睛:D.谢谢@西蒙丹谢谢,我会在代码中添加评论这是非常有帮助的!我确实制定了自己的解决方案,但我可以看出我需要练习高阶函数,因为它们使所有的东西都变得更短!4
如果
s,当我有超过
2
时,我通常使用
switch/case
哦,是的,我实际上会简化reduce过程中的逻辑。我会通过一点工作来减少这一点:)