2016-12-17 28 views
1

我想知道这之间的区别:和JavaScript的迭代VS过滤图

function doesCodeExist(arrvalidcodes, code) { 

    var hit = arrvalidcodes.filter(function(item){ 
    return (code === item) 
    }).map(function(item){ 
    return true; 
    }); 
    if (hit[0] === true) { 
    return true; 
    } else { 
    return false; 
    } 
} 

这样的:

function doesCodeExist(arrvalidcodes, code) { 

    for (var i = 0; i < arrvalidcodes.lenght; i++) { 
    if (arrvalidcodes[i] === code) { 
     return true; 
    } 
    } 
    return false; 
} 

两个代码应该做同样的事情,简单地返回true如果代码是在提供的阵列或以其他方式返回false

哪一个被认为是最可读的,哪个是更有效的方法呢?

+0

我会说第二个块效率更高,因为只要你找到了一些东西,就存在for循环,而第一个循环遍历所有的项目(并且它也不会读取,我确定它更喜欢第二部分 – Icepickle

+0

你认为哪个更具可读性?这个'if(hit [0] === true){ return true; } else { return false; }'可以缩短为:'return hit [0] === true;' – Craicerjack

+2

@Craicerjack'hit [0]'不能是除'true'或'undefined'之外的任何东西(只有在'hit.length === 0'时后一种情况) 。无论哪种方式,像这样使用'.filter'和'.map'是一个_horrendous_非直观和低效的方法来检查数组中是否存在元素。 – Alnitak

回答

1

你可以使用Array#indexOf

indexOf()方法返回在该给定元素可以在阵列中可以找到,或者如果-1它不存在的第一个索引。

function doesCodeExist(arrvalidcodes, code) { 
    return arrvalidcodes.indexOf(code) !== -1; 
} 

或ES6使用Array#includes

+0

好像是一个苛刻的downvote – Alnitak

+0

谢谢你更容易:) –

2

当然,你的第一个代码是更糟,因为它分配各种无用阵列和不可读。

如果你想语义ES5阵列的方法,用some

function doesCodeExist(arrvalidcodes, code) { 
    return arrvalidcodes.some(function(item){ 
    return code === item; 
    }); 
} 

当然,仅仅用严格的比较,你应该使用indexOf,或者是你想SameValueZero comparisson使用includes

+0

恕我直言,在这种情况下使用'.indexOf'(或'.includes',如果有的话)比使用'.some'自定义谓词功能更好 - 没有任何意义的替代一个回调完美的本地平等测试。 – Alnitak

+0

@Alnitak是的,这就是我在最后一段中的意思。但是对于自定义比较,应该使用'some'来代替'filter'和'map'。 – Oriol

+0

是的,绝对'一些'对于自定义比较器更好。尽管如此,纯平等测试更糟糕。 – Alnitak