首页 > 解决方案 > 为什么 array.filter 返回“ABCDE”和“UHY”

问题描述

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

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

然后我用

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

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

标签: javascript

解决方案


您的初始代码将无法正常工作,因为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.


推荐阅读