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)}代码>换句话说,拼接不仅仅是危险的,它还会不必要地膨胀代码=)