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;
}