Javascript 从数组中筛选出特定值
Javascript 从数组中筛选出特定值,javascript,arrays,function,web,Javascript,Arrays,Function,Web,破坏者([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
破坏者([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);
功能销毁程序(arr){
//删除所有值
var arg_num=arguments.length;
var new_arr=参数[0]。筛选器(函数(a){
对于(变量i=1;i
参数用于获取当前函数的参数列表。在执行筛选器时,您使用了参数,它给出了筛选器方法的参数。它不同于销毁程序方法参数
因此,将destroyer方法参数存储在一个变量中。
试试这个代码
功能销毁程序(arr){
//删除所有值
var args=参数;
var arg_num=args.length;
var标志;
var new_arr=参数[0]。筛选器(函数(a){
flag=false;
对于(变量i=1;i 日志(销毁程序([0,2,3,0,2,3],0,3))代码>参数用于获取当前函数的参数列表。在执行筛选器时,您使用了参数,它给出了筛选器方法的参数。它不同于销毁程序方法参数
因此,将destroyer方法参数存储在一个变量中。
试试这个代码
功能销毁程序(arr){
//删除所有值
var args=参数;
var arg_num=args.length;
var标志;
var new_arr=参数[0]。筛选器(函数(a){
flag=false;
对于(变量i=1;i 日志(销毁程序([0,2,3,0,2,3],0,3))
问题在于参数
关键字通常绑定到当前函数,在本例中,当前函数是过滤器
中使用的匿名函数
ES6允许通过引入
(功能销毁程序(arr){
var arg_num=arguments.length;
返回参数[0]。筛选器(a=>{
对于(变量i=1;i
但是,请注意,此函数具有costn m
,其中n
是数组中的元素数,m
是附加参数数。但可能会更好
例如,如果附加参数始终是数字,则可以对它们进行排序,然后使用二分法搜索。这将花费n lg(m)
另一种方法是使用哈希表。在最坏的情况下,它仍将花费n m
,但平均只花费n
(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]
如果不想手动实现,可以使用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]
问题是arguments
关键字通常绑定到当前函数,在本例中是过滤器中使用的匿名函数
ES6允许通过引入
(功能销毁程序(arr){
var arg_num=arguments.length;
返回参数[0]。筛选器(a=>{
对于(变量i=1;i
但是,请注意,此函数具有costn m
,其中n
是数组中的元素数,m
是附加参数数。但可能会更好
例如,如果附加参数始终是数字,则可以对它们进行排序,然后使用二分法搜索。这将花费n lg(m)
另一种方法是使用哈希表。在最坏的情况下,它仍将花费n m
,但平均只花费n
(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]
如果不想手动实现,可以使用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]
您可以改为使用库中的函数。它是一个经过良好测试并广泛使用的实用程序库
var _ = require('lodash');
var result = _.difference([1, 2, 3, 1, 2, 3], [2, 3])); // returns [1, 1]
您可以改为使用库中的函数。它是一个经过良好测试并广泛使用的实用程序库
var _ = require('lodash');
var result = _.difference([1, 2, 3, 1, 2, 3], [2, 3])); // returns [1, 1]
当数组中的值为0
时,函数将不起作用。您需要返回true of false而不是元素。如果值为0
且不是要删除的列表,请尝试此操作。它将从过滤器中返回该元素,该元素为falsy且不在列表中。@jcubic是的,如果您正确,现在我更新了代码。感谢您提供的信息。当数组中的值为0
时,您的函数将不起作用。您需要返回true of false而不是元素。如果值为0
且不是要删除的列表,请尝试此操作。它将从过滤器中返回该元素,该元素为falsy且不在列表中。@jcubic是的,如果您正确,现在我更新了代码。感谢您提供的信息。请注意,ES6集合使用进行比较,而不是使用。对于NaN
,它们的行为不同。请注意,ES6集合使用进行比较,而不是=
使用的。由于NaN
“应该”是一个强词,因为OP没有使用lodash。@Oriol将“应该”替换为can:)“应该”是一个强词,因为OP没有使用lodash。@Oriol将“应该”替换为can:)