我正在做我的项目,突然间我发现了这个问题,但不知道为什么。 我有数组:
arr=['ABCDE','HOANG','UHY']
然后我使用
arr.filter(x=>x.indexOf('H'))
结果将为(2) ["ABCDE", "UHY"]
答案 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);
答案 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);