![](/img/trans.png)
[英]Compare(filter) multiple array values from a dynamic array using Javascript
[英]JavaScript Remove Multiple Values from Array Using Filter and Loop
我是新来的,需要一些帮助来编写函数destroyer()
以从数组中删除多个值。
destroyer()函数传入一个数组和其他数字作为参数。 我们的想法是从数组中删除数字。
例如
destroyer([1, 2, 3, 1, 2, 3], 2, 3)
输出: [1, 1]
destroyer(["tree", "hamburger", 53], "tree", 53)
输出: ["hamburger"]
destroyer([2, 3, 2, 3], 2, 3)
输出: []
注意:示例仅显示要删除的2个附加数字。 但是函数destroyer()应该能够删除任意数量的值(即4个,5个或6个参数)。
但是,我的代码不会产生相同的结果。 具体来说,使用console.log,我发现我的过滤器功能没有正确循环。
1)任何人都可以帮我调试吗?
2)有没有更好的方法来编写这个函数?
非常感谢你!!!
function destroyer() {
var args = Array.prototype.slice.call(arguments);
var itemToRemove = args.slice(1);
console.log(itemToRemove);
var newArr = args[0];
console.log(newArr);
function filterer(value) {
for (var i = 0; i < itemToRemove.length; i++) {
console.log(i);
console.log(itemToRemove[i]);
if (value != itemToRemove[i]) {
return value;
}
}
}
return newArr.filter(filterer);
}
您的filterer
功能可以更简单:
function filterer (value) {
return itemToRemove.indexOf(value) === -1;
}
与时间复杂度方面的对象属性查找相比,使用Array.prototype.indexOf()
可能效率低下。 我建议一次循环其他参数并构造一个目标元素作为键被销毁的对象。 然后,您可以在传递给Array.prototype.filter()
的过滤回调中检查给定值是否为目标。
function destroyer() {
var arr = arguments.length && arguments[0] || [];
var targets = {};
for (var i = 1; i < arguments.length; i++) {
targets[arguments[i]] = true;
}
return arr.filter(function (x) {
return targets[x] === undefined;
});
}
这种方法的一个缺点是,并非JS中的所有值都可以是对象的有效属性,因为属性必须是字符串。 在这种情况下,您只是使用数字作为键,这些数字被隐式转换为字符串。
我们可以在filter()方法中将参数传递给我们的回调函数。
function destroyer(arr) {
return arr.filter(filterer(arguments)); // Pass arguments
}
function filterer(args) {
return function(value) { // Actual filter function
for (var i = 1; i < args.length; i++) {
if (value === args[i]) // Seek
return false; // Destroy
}
return true; // Otherwise keep
};
}
这传递了freeCodeCamp的所有5个测试用例 基本算法脚本| 寻求和毁灭 。
以下代码将从数组中删除元素。 它删除的元素由任何额外参数定义。 ...remove
是一项ES6功能,可将额外参数聚合到一个数组中。
我将迭代...remove
数组并从我们正在处理的主数组中删除该元素。
这是一个JSFiddle: https ://jsfiddle.net/zzyopnnp/
...extra_parameters
在大多数浏览器中不支持...extra_parameters
,您可能希望使用arguments
对象。
function removeIndex(array, index) {if(index>-1){array.splice(index, 1);}}
function destroyer(array, ...remove) {
remove.forEach(function(elem, index) {
removeIndex(array, index);
});
};
var arr = ["tree", "hamburger", 53];
destroyer(arr, "tree", 53);
console.log(arr);
一个简单的功能
function filter(arr, arg1, arg2){
var j = arr.length;
while(j){
if (arr.indexOf(arg1) > -1 || arr.indexOf(arg2) > -1){
arr.splice(j - 1, 1);
}
j--
}
}
对于多个参数
一个简单的功能
function filter(){
var j = -1;
for(var i = 1; i < arguments.length; i++){
j = arguments[0].indexOf(arguments[i]);
if(j > -1){
arguments[0].splice(j, 1);
}
}
return arguments[0];
}
你可以调用这个没有args的函数,例如:
filter([1,2,3,4,5,6,7,8,9], 1, 3, 5); //return [2,4,6,7,8,9]
filter([1,2,3,4,5,6,7,8,9], 1); //return [2,3,4,5,6,7,8,9]
这里有很好的答案,但你可以用这种方式做得非常干净,记住你在filter方法中有一个对象选项,你可以在回调函数中使用,在这种情况下我使用它就像: arguments [i]所以我可以检查arguments数组中的每个值
function destroyer(arr) {
for(var i = 1; i < arguments.length; i++){
arr = arr.filter(isIn, arguments[i]);
}
function isIn(element,index, array){
if (element != this){
return element;
}
}
return arr;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.