过滤器不返回索引值javascript

时间:2018-10-22 12:41:06

标签: javascript ecmascript-6

我在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);

5 个答案:

答案 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