Javascript 从阵列中删除所有出现的数字
我正在努力解决以下问题 给定一个数组和一个值,请在中删除该值的所有实例 放置并返回新的长度 我已经为它编写了下面的代码,但它总是返回一个空数组Javascript 从阵列中删除所有出现的数字,javascript,Javascript,我正在努力解决以下问题 给定一个数组和一个值,请在中删除该值的所有实例 放置并返回新的长度 我已经为它编写了下面的代码,但它总是返回一个空数组 /** * @param {number[]} nums * @param {number} val * @return {number} */ var removeElement = function(nums, val) { for (var i=0; i< nums.length; i++) {
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
for (var i=0; i< nums.length; i++)
{
if (nums[i] == val)
nums.slice(i);
}
return nums;
};
/**
*@param{number[]}nums
*@param{number}val
*@return{number}
*/
var removelement=函数(nums,val){
对于(变量i=0;i
首先,slice()
不会删除数组中的项,所以首先将其更改为splice()
。其次,删除元素时需要减少i
,这样就不会跳过任何元素
var removelement=函数(nums,val){
对于(变量i=0;i 控制台日志(nums)
在函数中,在nums
数组中找到与val
匹配的第一个位置。如果未找到匹配项,则索引为-1,函数返回nums
数组的长度。另一方面,如果存在匹配项,则删除该项并再次递归调用该函数,直到不再存在任何匹配项
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
const position = nums.findIndex(number => number === val);
if(position === -1) {
return nums.length;
} else {
nums.splice(position, 1);
}
return removeElement(nums, val);
};
使用阵列拼接而不是切片
var removelement=函数(nums,val){
对于(var i=nums.length-1;i>=0;i--){
if(nums[i]==val){
数量拼接(i,1);
}
}
返回nums.length;
};
var n=[1,2,3,2,1,2,3,2,1];
日志(移除元素(n,1));
控制台日志(n)代码>使用拼接方法,如:
nums.splice(i,1);
因此,代码将如下所示:
var removelement=函数(nums,val){
对于(var i=0;i,正如其他人所指出的,使用slice
根本无法完成任何事情。然而,正如许多答案所表明的那样,使用splice
,既低效又不必要,并且会导致需要向后迭代数组或调整循环索引等尴尬情况
相反,您可以简单地遍历数组,复制要保留在原始元素之上的元素,使用变量j
跟踪到目前为止保留了多少项。然后调整数组的长度(并返回它,因为这是规范):
在这里,我们设计了条件
来获取相同的(val、index、array)
签名作为传递给数组#过滤器的函数,以防万一,即使最后两个参数未在此处使用。您可以使用reduceRight在数组上迭代并删除与要删除的值匹配的元素。您可以确定是使用=
还是=
进行比较
reduceRight从右向左非常方便,因此删除元素不会影响下一个要检查的元素的索引
/**
*@param{number[]}nums-要筛选的数字数组
*@param{number}val-要从nums中删除的值
*@return{number}缩减数组的长度
*/
函数删除元素(nums,val){
返回nums.length?nums.reduceRight(函数(acc,value,i){
如果(值==val)为数值拼接(i,1);
返回nums
},空)。长度:0;
};
var nums=[1,2,3,4,5,6,4];
var=4;
log('initialnums:'+nums);
log('要删除的值:'+val);
log('New length:'+removelement(nums,val));
console.log('Final nums:'+nums);
使用过滤器:
var words = ["spray", "spray", "spray", "spray", "destruction", "present"];
var removeElement = function(nums, val) {
return words.filter(function(word){
return word !== val;
}).length;
}
你能演示你的代码是如何运行的吗?你的代码不修改数组(<代码>切片返回一个新数组),所以如果你得到一个空数组,那是因为你传递了一个空数组。无论如何,看看并考虑下一个元素在拼接某物时会发生什么。<代码> @返回{编号}。< /代码> -不,您返回NURS,这是一个ARAYNOTHT:当用<代码>数组.SPLICE < /代码>删除数组项时,循环向后不向前。或者,使用<代码>数组.Faster 。这基本上是您正在做的。考虑使用。因为您正在修改数组,如果从左到右循环,则可以跳过索引。不,这是相同的COD。向question@JayPatel试着把它包装在一个片段中,这样我们就可以看到你的代码了!不,@JaromandaX我使用了不同的slice方法是的,你使用了slice,这不是正确的方法,并添加了一个长度参数,这有效地使你的代码与问题完全相同。无论如何,你需要理解usi的全部后果ng splice…由于以下原因,您的代码未能删除其中一个5
this@JaromandaX你是对的,我确实为拼接
提供了错误的参数,我显然忘记了它是如何工作的。感谢你指出这一点。但是我确实希望得到一个数组。这也是OP所期望的。从问题:“并返回新的长度”.@JaromandaX我已经编辑了我的问题。现在基本上和你的问题一样,但是因为我在你之前发布了,所以我觉得可以把它留在这里。如果你能删除否决票,我将不胜感激,但你不必向上投票。@Clonkex-既然你返回了正确的东西,我更喜欢你的答案:pI来学习吧,我会支持向上投票:pSu是的,但是使用splice
就像用大锤打死苍蝇。@torazaburo-这…不好吗?@JaromandaX好的,你知道吗,你和nnnnnn
是对的。我可能误解了这个要求,因为OP有缺陷地试图满足那个要求。我没有注意到注释文档指定了一个数字作为re转换值。我还假设返回正确的值是非常明显的,OP一定返回了正确的类型。我的错误是,OP有很多重复
// Filter an array in place, based on a condition.
function filterInPlace(arr, condition) {
let j = 0;
for (let i = 0; i < arr.length; i++)
if (condition(arr[i], i, arr)) arr[j++] = arr[i];
return arr.length = j;
}
// Remove a particular value from an array, in-place.
function removeElement(nums, val) {
return filterInPlace(nums, function(value) { return value !== val; });
}
var words = ["spray", "spray", "spray", "spray", "destruction", "present"];
var removeElement = function(nums, val) {
return words.filter(function(word){
return word !== val;
}).length;
}