фильтр не возвращает значение индекса javascript - PullRequest
0 голосов
/ 22 октября 2018

У меня есть строка в 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 голосов
/ 22 октября 2018

Array.filter () создает новый массив на основе результата обратного вызова.Если возвращаемое значение в каждом обратном вызове верное, будет возвращен новый массив со всеми элементами.Если возвращаемое значение каждого обратного вызова в falsy, будет создан пустой массив.

Так что в этом условии

if(letter === 'X'){
  return index;
}

индекс будет числом> 0 (правда), таквсе 'X' будут возвращены как новый массив.Если первый символ в вашем вводе - «X», оператор возврата будет 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)
0 голосов
/ 22 октября 2018

Вы можете делать все, что хотите, без необходимости сначала разбивать строку:

let xes = [];
for (let i = 0; (i = str.indexOf("X", i)) !== -1; xes.push(i++));

Находит каждое "X" с .indexOf(), начиная с последней позиции плюс 1.

0 голосов
/ 22 октября 2018

Я думаю, что было бы лучше заполнить массив индексов с помощью цикла 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);
0 голосов
/ 22 октября 2018

Вместо этого можно использовать 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);
0 голосов
/ 22 октября 2018

Вы можете взять Array.from, получить каждый символ строки (как любой другой итеративный) и отобразить индекс или -1 для нежелательного символа.Позже фильтруйте только нужные индексы.

Для этой задачи вам понадобятся два цикла, потому что первый берет индексы, а второй фильтрует промежуточный результат.Ваш подход, принимая только Array#filter, возвращает элементы, но не индекс элемента.После фильтрации индексы исчезли.

const str = 'Hello there XXXX, how are you?';

let indexes = Array.from(str, (c, i) => c === 'X' ? i : -1).filter(i => i !== -1);

console.log(indexes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...