реагировать на фильтрацию объекта массивов - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь найти лучший способ удалить пары значений объекта, которые содержат пустую строку ""

мое текущее состояние:

 this.state = {

            searchParams:{
                query: '',
                colors: [],
                text: '',
                legalities: '',
                setName: '',
                pageSize: 4
            }
}

Я знаю, это выиграл не работаю с моим состоянием, так как оно не является массивом, но что-то вроде этого - то, чего я пытаюсь достичь прямо сейчас

var search = this.state.searchParams.filter(function (el) {
            return el !== "";
          });

Кто-нибудь может направить меня в правильном направлении и объяснить лучше сделать это с объектом, спасибо :)?

Ответы [ 6 ]

1 голос
/ 18 февраля 2020

Если вы также хотите отфильтровать пустые строки и строки (только с пробелами), мы обрежем строку и затем проверим ее длину. Если его строка и его длина равны 0 после обрезки, то она считается пустой и будет отфильтрована.

const params = this.state.searchParams

Object.keys(this.state.searchParams).filter(key => 
  !(typeof params[key] === 'string' && params[key].trim().length === 0)
)

Если вы не хотите обрезать, то:

const params = this.state.searchParams

Object.keys(this.state.searchParams).filter(key => params[key] !== '')

Я бы настоятельно рекомендовал вам не использовать точку с запятой, так как она занимает место, а JS теперь может игнорировать точку с запятой также. Кроме того, не используйте двойные кавычки, если не требуется.

1 голос
/ 18 февраля 2020

Самый простой способ - использовать метод Object.keys , а затем выполнить итерацию всего объекта. затем проверьте, истинно ли searchParams[ele], и добавьте еще один объект.

    var newObj = {};
    Object.keys(this.state.searchParams).forEach(ele => {
      if (searchParams[ele]) {
        newObj = { ...newObj, [ele]: searchParams[ele] };
      }
    });
    console.log(newObj); // new object generated with empty values eliminated
this.setState({searchParams:newObj})
1 голос
/ 18 февраля 2020

используйте Object.keys. В вашем случае так: var search = Object.keys(this.state.searchParams).filter(el => { // do something })

1 голос
/ 18 февраля 2020

filter используется только для массива, а не для объекта.

Вы можете попробовать мой код

let searchParams = 
    Object.keys(this.state.searchParams)
          .filter( key => this.state.searchParams[key] !== '' );

this.setState({searchParams })
1 голос
/ 18 февраля 2020

Вы можете отфильтровать его таким образом, используя метод Reduce. Поскольку это объект, для его фильтрации необходимо объединить прототип объекта .keys с прототипом массива .reduce.

const searchParams = {
  query: '',
  colors: [],
  text: '',
  legalities: '',
  setName: '',
  pageSize: 4
}

const notEmpty = Object.keys(searchParams).reduce((nonEmptyObj, currentKey) => {
  if (searchParams[currentKey] !== '') {
    nonEmptyObj[currentKey] = searchParams[currentKey];
  }
  return nonEmptyObj;
}, {})

console.log(notEmpty);
1 голос
/ 18 февраля 2020

Вы можете использовать Object.entries и Object.fromEntries.

const filteredObject = Object.fromEntries(
    Object.entries(searchParams)
        .filter(([key, value]) => value !== "")
);

Создает новый объект со всеми ключами, для которых значение было "" удалено.

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