Одна строка, если оператор в операторе приведения не работает - PullRequest
3 голосов
/ 07 мая 2019

Я пытаюсь написать оператор redu * , который дает массив строк, возвращает индекс массива, содержащий слово 'lace'.

Я получил его для работы смногострочный оператор if, но он не работает, если я использую однострочный оператор if:

массив ввода

arr = [ 'tasselled', 'black', 'low-top', 'lace-up' ]

ожидаемый вывод

[3] // since the string 'lace' is in the 3rd index of the array

Мой код

// works (multi-line if statement)
arr.reduce( function(a,e,i) {
    if (e.indexOf('lace') >= 0) {
      a.push(i)
    }
    return a
  }, [])

// returns [3]
// doesn't work (single-line if statement)
arr.reduce( (a,e,i) => e.indexOf('lace')>=0 ? a.push(i) : 0, []);

// side note - can you do single-line if-statements without the else statement? (without the ': 0')

// returns error:
TypeError: a.push is not a function

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

Основная причина, по которой он не работает, заключается в том, что ваша троичная операция возвращает число в обоих сценариях..push() возвращает length массива, а не сам массив.

Таким образом, вы можете изменить его на использование concat:

const arr = [ 'tasselled', 'black', 'low-top', 'lace-up' ]
const output = arr.reduce((a,e,i) => e.includes('lace') ? a.concat(i) : a, []);

console.log(output)

Другим вариантом является filter keys массива

const arr = [ 'tasselled', 'black', 'low-top', 'lace-up' ]
const output = [...arr.keys()].filter(i => arr[i].includes('lace'))

console.log(output)
2 голосов
/ 07 мая 2019

В вашем операторе Reduce, если indexOf <0, вы возвращаете 0 вместо массива, попробуйте </p>

arr = [ 'tasselled', 'black', 'low-top', 'lace-up' ];

let r=arr.reduce( (a,e,i) => (e.indexOf('lace')>=0 ? a.push(i) : 0, a), []);

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