JS: Фильтр массив только для непустых и тип строковых значений

1

Я пытаюсь отфильтровать массив следующим образом:

array.filter(e => { return e })

С этим я хочу отфильтровать все пустые строки, включая undefined и null. К сожалению, в моем массиве есть несколько массивов, которых не должно быть. Поэтому мне нужно также проверить только значения строк и удалить все остальные.

Как я могу это сделать?

Теги:
arrays

5 ответов

3
Лучший ответ

Вы можете проверить тип элементов с помощью typeof:

array.filter(e => typeof e === 'string' && e !== '')

Поскольку '' является ложным, вы можете упростить, просто проверив, если e был правдивым, хотя приведенное выше является более явным

array.filter(e => typeof e === 'string' && e)

const array = [null, undefined, '', 'hello', '', 'world', 7, ['some', 'array'], null]

console.log(
  array.filter(e => typeof e === 'string' && e !== '')
)
  • 0
    Это тоже работает, но имейте в виду, что typeof e === 'string' && e может возвращать строку и не всегда логическое значение, как того требует определение обратного вызова фильтра.
  • 0
    @cyrix, обратный вызов фильтрует по значениям, которые приводят к истине (правдиво) . Я предпочитаю быть неявным, это было просто предоставлено для сравнения
Показать ещё 1 комментарий
4

Вы можете проверить строку и удалить оба метода фильтра:

array.filter(e => (typeof e === 'string') && !!e)

Примечание !!e возвращает false если элемент имеет значение null, undefined, '' или 0.

Следует отметить, что синтаксис "стрелка" -function работает только в браузерах, поддерживающих ES6 или выше.

Альтернативой является:

array.filter(function(e) {
    return (typeof e === 'string') && !!e;
});

Примечание. Имейте в виду, что Array.prototype.filter не существует в старых браузерах.

1

> [1, 3, 5].filter (строка)
[1,3,5]

0
const justStrings = array.filter(element => 
    (typeof element === 'string' || element instanceof String)
    && element
)

объяснение

Чтобы быть shure, ваш элемент является string вы должны проверить, что это не тип переменной (let str = 'hello') или экземпляр String (new String('hello')), потому что этот случай возвращает object по typeof element.

Кроме того, вы должны проверить, существует ли ваш элемент.

0

При возврате метода, который состоит из одной строки в качестве обратного вызова в es6, нет необходимости в return поскольку это происходит неявно.

Надеюсь это поможет :-)

let arr = ["", "", "fdsff", [], null, {}, undefined];

let filteredArr = arr.filter(item => (typeof item === "string" && !item) || !item)
                  
console.log(filteredArr)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню