从数组中筛选出特定值
Filtering out specific values from an array
destroyer([1, 2, 3, 1, 2, 3], 2, 3)
应该返回[1, 1]
,但它返回[1, 2, 3, 1, 2, 3]
。这个代码出了什么问题?
function destroyer(arr) {
// Remove all the values
var arg_num = arguments.length;
var new_arr = arguments[0].filter(function(a){
for (var i = 1; i < arg_num; i++){
if (a === arguments[i]) a = false;
}
return a;
});
return new_arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
参数用于获取当前函数的参数列表。在执行您使用的参数的筛选时,它给出了筛选方法的参数。它不同于destroyer方法参数。
因此,将destroyer方法参数存储在一个变量中。试试这个代码。
function destroyer(arr) {
// Remove all the values
var args = arguments;
var arg_num = args.length;
var flag;
var new_arr = arguments[0].filter(function (a) {
flag = false;
for (var i = 1; i < arg_num; i++) {
if (a === args[i]) {
flag = true;
break;
};
}
if (flag)
return false;
else
return true;
});
return new_arr;
}
console.log(destroyer([0, 2, 3, 0, 2, 3], 0, 3));
希望这对你有帮助。
您可以使用lodash
库中的difference
函数。这是一个经过充分测试并广泛使用的实用程序库。
var _ = require('lodash');
var result = _.difference([1, 2, 3, 1, 2, 3], [2, 3])); // returns [1, 1]
问题是arguments
关键字通常绑定到当前函数,在本例中是filter
中使用的匿名函数。
ES6允许通过引入不绑定arguments
的箭头函数来轻松修复此问题。
(function destroyer(arr) {
var arg_num = arguments.length;
return arguments[0].filter(a => {
for (var i = 1; i < arg_num; i++){
if (a === arguments[i]) return false;
}
return true;
});
})([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1]
但是,请注意,此函数具有开销n m
,其中n
是数组中元素的数量,m
是附加参数的数量。但可能会更好。
例如,如果附加参数始终是数字,则可以对它们进行排序,然后使用二分搜索。这将花费n lg(m)
。
另一种方法是使用哈希表。在最坏的情况下,它仍将花费n m
,但平均仅花费n
。
如果您不想手动实现,可以使用ES6集合。它的具体成本将取决于实现,但要求平均为次线性。
(function destroyer(arr, ...args) {
var s = new Set(args);
return arr.filter(a => !s.has(a));
})([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1]
相关文章:
- 根据多个值筛选数组
- 使用特定值筛选数组
- 在javascript中按字符串长度筛选数组
- 如何筛选数组数组
- 如何获取输入字段的值并使用它来筛选数组
- 基于键和值的筛选数组
- 对多个选项进行筛选数组以在新选择中返回选项
- AngularJS ngOptions按布尔字段筛选数组
- 使用用户输入的维度,根据每个元素中的字符数筛选数组
- 需要有关创建筛选数组内容的复选框的帮助
- 使用jQuery筛选数组
- 如何使用foreach绑定将select选项中的参数传递给触发器和筛选数组可观测值
- 如何使用jQuery.grep()动态筛选数组
- 数组的严格筛选数组
- 在PHP中使用关键字筛选数组
- 基于javascript中的另一个数组筛选数组
- 基于索引数组筛选数组
- 为提前输入筛选数组的最快方法
- Angularjs基于array类型的属性来筛选数组
- 返回只包含与给定值匹配的元素的筛选数组