我在js中有一个字符串,我想记录字母X
的每个实例的索引。
我首先尝试使用map
,但是它只是返回了undefined
以及我可以使用的索引,但需要附加功能。
然后我改用filter
,但不幸的是,这没有返回索引。参见下面的示例:
const str = 'Hello there XXXX, how are you?';
let indexes = str.split('').filter((letter, index) => {
if(letter === 'X'){
return index;
}
});
console.log(indexes);
答案 0 :(得分:2)
您可以改用reduce
。这里,我们提供一个数组作为初始值,并在迭代中满足条件时将索引推入该数组。
const str = 'Hello there XXXX, how are you?';
let indexes = str.split('').reduce((arr, letter, index) => {
if (letter === 'X') arr.push(index);
return arr;
}, []);
console.log(indexes);
答案 1 :(得分:1)
我认为最好使用forEach
循环来填充索引数组:
const str = 'Hello there XXXX, how are you?';
let indexes = [];
str.split('').forEach((letter, index) => {
if(letter === 'X'){
indexes.push(index);
}
});
console.log(indexes);
答案 2 :(得分:1)
您可以执行所需的操作而不必先拆分字符串:
let xes = [];
for (let i = 0; (i = str.indexOf("X", i)) !== -1; xes.push(i++));
从最后一个位置加1开始,找到每个.indexOf()
的“ X”。
答案 3 :(得分:1)
Array.filter()根据回调结果创建一个新数组。如果每个回调的返回值是真实的,则将返回一个包含所有元素的新数组。如果每个回调的返回值均为falsy,则将构造一个空数组。
在这种情况下,
if(letter === 'X'){
return index;
}
索引将是一个数字> 0(真实),因此所有的'X'将作为新数组返回。如果输入的第一个字符为'X',则return语句将为0
,这是虚假的,并且该字符将不在filter()
返回的新构造的数组中。
您可以改用类似这样的文字
const str = 'Hello there XXXX, how are you?';
str.split('')
.map((e, i) => e === 'X' ? {allow: true, index: i} : {allow: false})
.filter(e => e.allow)
.map(e => e.index)
答案 4 :(得分:0)
您可以使用Array.from
,获取字符串的每个字符(以及其他任何可迭代的字符),并将索引或info.call_back(&yo, 10, 10)
映射为不需要的字符。以后只过滤需要的索引。
此任务需要两个循环,因为第一个循环获取索引,第二个循环过滤中间结果。您仅采用Array#filter
的方法将返回元素,但不会返回元素的索引。过滤后,索引消失了。
-1