为什么array.filter返回“ ABCDE”和“ UHY”

时间:2019-12-13 15:10:13

标签: javascript

我正在做我的项目,突然间我发现了这个问题,但不知道为什么。 我有数组:

arr=['ABCDE','HOANG','UHY']

然后我使用

arr.filter(x=>x.indexOf('H'))

结果将为(2) ["ABCDE", "UHY"]

3 个答案:

答案 0 :(得分:4)

您的初始代码将无法正常工作,因为indexOf返回一个整数,该整数具有作为参数传递的字母的索引,而不是布尔值(如果字符串中是否存在该字符串)

console.log('ABCDE'.indexOf('H')); // -1 (means true)
console.log('HOANG'.indexOf('H')); // 0 (means false)
console.log('UHY'.indexOf('H')); // 1

为避免这种情况,您必须将indexOf与NOT -1的结果进行比较:

var arr = ['ABCDE','HOANG','UHY'];

var result = arr.filter(x=> x.indexOf('H') !== -1);

console.log(result);

如果您使用的是ECMAScript 6,则可以使用String.prototype.includes(),因为它返回的是布尔值而不是索引号。 (感谢@Vidushan Chooriyakumaran的建议)

const arr = ['ABCDE','HOANG','UHY'];

const result = arr.filter(x=> x.includes('H'));

console.log(result);

请注意,由于我在这里假设使用ES6,因此我也使用const而不是var

答案 1 :(得分:1)

当index of找不到匹配的元素(在这种情况下为字母H)时,它返回-1。由于-1是真实值!!-1 === true,因此不会过滤掉第一项。但是,H字母是HOANG(索引0)和!!0 === false中的第一项。

过滤掉indexOf返回-1的项目:

const arr=['ABCDE','HOANG','UHY']

const result = arr.filter(x=>x.indexOf('H') !== -1)

console.log(result)

答案 2 :(得分:0)

indexOf将在没有匹配项时返回-1。请改用includes

const arr = ['ABCDE','HOANG','UHY'];
const result = arr.filter(x => x.includes('H'));
console.log(result);