如何删除JS中参数指定的数组中的元素
How do I remove elements in an array specified by arguments in JS?
我正在进行一项赋值,在该赋值中,我得到了一个数组和不同数量的参数。我必须从初始数组中删除所有与这些参数值相同的值。这是我的代码:
function destroyer(arr) {
for(var i = 1; i < arguments.length; i++)
{
for(var j = 0; j < arr.length; j++)
{
if(arguments[i] == arr[j])
{
arr.splice(j, 1);
}
}
}
return arr;
}
destroyer([3, 5, 1, 2, 2], 2, 3, 5)
我得到了一些数组和参数模式的正确输出,但对于上面的例子,它应该只输出[1],但我的代码正在输出[1,2]。如有任何帮助,我们将不胜感激。谢谢
执行.splice()
移除项目时,它会将后面的元素移动到数组中的某个位置,如果恰好也是匹配的,则会导致for
循环错过下一个元素。您可以通过在删除项目后递减for
循环索引来解决这个问题,或者(我最喜欢的)您可以从后到前迭代数组,这样.splice()
就不会影响未来的任何迭代。
使用您的通用代码结构,以下是递减解决方案:
function destroyer(arr) {
for(var i = 1; i < arguments.length; i++)
{
for(var j = 0; j < arr.length; j++)
{
if(arguments[i] == arr[j])
{
arr.splice(j, 1);
--j;
}
}
}
return arr;
}
var result = destroyer([3, 5, 1, 2, 2], 2, 3, 5);
document.write(JSON.stringify(result));
使用您的通用代码结构,以下是反向迭代解决方案:
function destroyer(arr) {
for(var i = 1; i < arguments.length; i++)
{
for(var j = arr.length - 1; j >= 0; j--)
{
if(arguments[i] == arr[j])
{
arr.splice(j, 1);
}
}
}
return arr;
}
var result = destroyer([3, 5, 1, 2, 2], 2, 3, 5);
document.write(JSON.stringify(result));
您还可以使用其他阵列助手函数来利用更多的本机阵列功能:
function destroyer(arr) {
var removes = Array.prototype.slice.call(arguments, 1);
return arr.filter(function(item) {
return removes.indexOf(item) === -1;
});
}
var result = destroyer([3, 5, 1, 2, 2], 2, 3, 5);
document.write(JSON.stringify(result));
使用ES6套装以提高潜在效率:
function destroyer(arr) {
var removes = new Set(Array.prototype.slice.call(arguments, 1));
return arr.filter(function(item) {
return !removes.has(item);
});
}
var result = destroyer([3, 5, 1, 2, 2], 2, 3, 5);
document.write(JSON.stringify(result));
仅供参考,在前面的代码示例中,我尝试过:
var removes = new Set(arguments);
因为它看起来更干净,在IE和Chrome中也很好用,但Firefox中的一个错误使它无法在那里工作。ES6中的arguments
应该是一个可迭代的,可以传递给Set
构造函数,但Firefox还没有正确实现它。关于这个主题,有一个开放的Firefox bug正在处理中。因此,我放弃了这个代码示例,将其复制到一个真实的数组中,并将数组传递给构造函数。
另一种可能性是使用ES6休息参数:
function destroyer(arr, ...items) {
var removes = new Set(items);
return arr.filter(function(item) {
return !removes.has(item);
});
}
var result = destroyer([3, 5, 1, 2, 2], 2, 3, 5);
document.write(JSON.stringify(result));
使其(使用indexOf
和while
循环)
function destroyer(arr) {
for(var i = 1; i < arguments.length; i++)
{
var index = arr.indexOf( arguments[i] );
while( index != -1 )
{
arr.splice(index, 1);
console.log(arr);
index = arr.indexOf( arguments[i] );
}
}
return arr;
}
您需要反复检查它,而不是只检查一次,除非index
是-1
通过同样的练习,即使指令中规定使用Arguments对象,这个解决方案也能工作:
function destroyer(arr, ...valsToRemove) {
return arr.filter(elem => !valsToRemove.includes(elem));
}
相关文章:
- Webdriver.io pageObject模式-通过传递参数来定义元素选择器
- 如何在HTML元素上创建函数,而不是将元素作为参数传递
- 如何传递元素's ID作为使用getElementById的函数的参数
- 在动态创建的元素中包含参数的事件处理程序
- 是否可以将一个元素还原为它's上一个位置,而不将该位置作为参数传递
- Javascript-函数获取数组元素参数未定义/为null
- td元素中带有传递参数的Javascript函数
- 如何从输入元素传递参数
- 可以't获取此函数以删除基于javaScript中后续参数的特定元素
- 元素id未被接受为函数参数
- 基于参数(angular)调用特定元素上的ng show
- 隐藏JavaScript函数中作为参数传递的元素的父元素
- 使用字符串方法更改Javascript对象中的DOM元素参数
- 无法让悬停事件使用 jQuery UI 持续时间参数或 CSS 处理目标元素的同级元素
- 如何选择使用Jquery作为参数传入的DOM元素
- 删除元素并将其添加到 javascript 中的函数参数列表中
- 使用基于查询字符串参数的 Angular 填充选择元素
- 使 HTML 元素可见/不可见取决于 HttpServletRequest 参数
- 数组元素作为 getElementById().check 的参数
- 从带有字符串参数的函数中的元素中获取值