Javascript 从数组中删除最小值,但如果重复,则仅删除一次

Javascript 从数组中删除最小值,但如果重复,则仅删除一次,javascript,arrays,Javascript,Arrays,我有下面的函数,它应该从数组中删除最小的值,但是如果这是一个重复的函数,它只会删除第一个值,而保留其他值 var array1 = [1, 2, 3, 4, 5]; var array2 = [5, 3, 2, 1, 4]; var array3 = [2, 2, 1, 2, 1]; function removeSmallest(numbers) { return numbers.filter(function(elem, pos, self) { if(elem == Math

我有下面的函数,它应该从数组中删除最小的值,但是如果这是一个重复的函数,它只会删除第一个值,而保留其他值

var array1 = [1, 2, 3, 4, 5];
var array2 = [5, 3, 2, 1, 4];
var array3 = [2, 2, 1, 2, 1];

function removeSmallest(numbers) {
  return numbers.filter(function(elem, pos, self) {
    if(elem == Math.min.apply(null, numbers) && pos == self.indexOf(elem)) {
      // Remove element from Array
      console.log(elem, pos);
      numbers.splice(pos, 1);
    };
    return numbers;
  });
};
通过
console.log(elem,pos)
我知道我已经正确识别了阵列中的最小元素和第一个元素,但是当我尝试通过
splice()
移除它时,我最终得到了阵列的以下结果:

array1 = [1, 3, 4, 5]; // But I expected [2, 3, 4, 5]
array2 = [5, 3, 2, 1]; // But I expected [5, 3, 2, 4]
array3 = [2, 2, 1, 1]; // But I expected [2, 2, 2, 1]
你知道我的代码有什么问题吗?提前感谢您的回复

function removeSmallest(numbers) {
    const smallest = Math.min.apply(null, numbers);
    const pos = numbers.indexOf(smallest);
    return numbers.slice(0, pos).concat(numbers.slice(pos + 1));
};
你不应该像你那样使用
filter()
。函数应该返回一个新的数组而不是修改现有的数组,这也是一个很好的实践,并且在迭代数组时绝对不应该修改数组

function removeSmallest(arr){
var temp=arr.slice(),smallElement=null;
temp.sort(sortReverse);
smallElement=temp[temp.length-1];
var position=arr.indexOf(smallElement);
arr.splice(pos,1);
console.log(arr);
}

function sortReverse (a,b){
if(a<b){return 1}
else if(a>b){return -1;}
else{return 0;}
}

var array1 = [1, 2, 3, 4, 5];
removeSmallest(array1);
你不应该像你那样使用
filter()
。函数应该返回一个新数组,而不是修改现有数组,这也是一种很好的做法,而且在迭代数组时绝对不应该修改数组。

函数removesmalest(arr){
function removeSmallest(arr){
var temp=arr.slice(),smallElement=null;
temp.sort(sortReverse);
smallElement=temp[temp.length-1];
var position=arr.indexOf(smallElement);
arr.splice(pos,1);
console.log(arr);
}

function sortReverse (a,b){
if(a<b){return 1}
else if(a>b){return -1;}
else{return 0;}
}

var array1 = [1, 2, 3, 4, 5];
removeSmallest(array1);
var temp=arr.slice(),smallElement=null; 临时排序(sortReverse); smallElement=温度[温度长度-1]; var位置=arr.indexOf(小元素); 阵列拼接(位置1); 控制台日志(arr); } 函数排序逆(a,b){ if(ab){return-1;} else{return 0;} } var array1=[1,2,3,4,5]; removeSmallest(阵列1);
功能移除最小(arr){
var temp=arr.slice(),smallElement=null;
临时排序(sortReverse);
smallElement=温度[温度长度-1];
var位置=arr.indexOf(小元素);
阵列拼接(位置1);
控制台日志(arr);
}
函数排序逆(a,b){
if(ab){return-1;}
else{return 0;}
}
var array1=[1,2,3,4,5];
removeSmallest(阵列1);

numbers=numbers.slice(pos,1)
-使用slice并存储它不起作用,我仍然得到相同的结果。或者你能给我看一个有正确结果的
小提琴吗?谢谢大家!<代码>数字=数字。切片(位置,1)
-使用切片并存储它。如果不起作用,我仍然会得到相同的结果。或者你能给我看一个有正确结果的
小提琴吗?非常感谢。谢谢你,伙计!它起作用了:)但是为了完成你的问题,为什么我以错误的方式使用了
filter()
filter()
迭代数组并用当前项调用谓词函数。谓词函数应该返回
true
false
。如果
false
,则该项将从数组中删除。您将返回数组本身,它是“真实的”,因此不会从数组中删除任何内容。实际上,您只是在复制
forEach()
的功能。但更重要的是,您正在迭代过程中拼接阵列。在这种情况下,这会导致循环错过对一个项的迭代。如果要使用
filter()
来解决此问题,您可以这样做:
return numbers.filter(function(elem,pos,self){return elem!==Math.min.apply(null,numbers)| pos!==self.indexOf(elem)}换句话说,拼接不仅仅是危险的,它还不必要地膨胀了代码=)谢谢!它起作用了:)但是为了完成你的问题,为什么我以错误的方式使用了
filter()
filter()
迭代数组并用当前项调用谓词函数。谓词函数应该返回
true
false
。如果
false
,则该项将从数组中删除。您将返回数组本身,它是“真实的”,因此不会从数组中删除任何内容。实际上,您只是在复制
forEach()
的功能。但更重要的是,您正在迭代过程中拼接阵列。在这种情况下,这会导致循环错过对一个项的迭代。如果要使用
filter()
来解决此问题,您可以这样做:
return numbers.filter(function(elem,pos,self){return elem!==Math.min.apply(null,numbers)| pos!==self.indexOf(elem)}换句话说,拼接不仅仅是危险的,它还会不必要地膨胀代码=)