Как проверить, является ли свойство пустым в методе фильтра - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть список объектов, и я должен искать их по идентификатору и имени. Некоторые из моих объектов имеют «имя»: ноль, и я получаю сообщение об ошибке

Невозможно прочитать свойство «включает» пустое значение

Object.keys(result).forEach(key => {
      if (this.filters.searchBy && this.filters.searchBy.length) {
        result[key] = result[key].filter(r =>
          this.filters.searchBy.includes(r.id) ||
          r.name.includes(this.filters.searchBy));
      }
    });

Я пытался

if (r.name !== null) {

}

но это не правильный синтаксис

Ответы [ 4 ]

2 голосов
/ 29 апреля 2020

Дополнительные функции Chain & Arrow

Вы можете использовать '.?' чтобы избежать необходимости проверять нули на свойства. Кроме того, вы можете использовать функции стрелок для простой фильтрации массива в JavaScript.

. Вот пример кода:

let list = [
  {name: 'John Smith', age: 13},
  {name: 'Peter Jones', age: 23},
  {name: 'Jane Doe', age: 54},
  {name: null, age : 12},
  {age: 72}
];

let result = list.filter(i => {
    return (
        i.name?.startsWith("J") &&
        i.age < 40
    )
});

console.log(result);
// Returns only "John Smith"

Без опциональной цепочки

Как указал Макьен Вы, возможно, не сможете нам необязательную цепочку. В этом случае вы можете просто проверить каждое поле перед его использованием, как показано ниже.

let list = [
  {name: 'John Smith', age: 13},
  {name: 'Peter Jones', age: 23},
  {name: 'Jane Doe', age: 54},
  {name: null, age : 12},
  {age: 72}
];



let result = list.filter(i => {
    return (
        i.name && // If 'name' is null the condition will fail fast
        i.name.startsWith("J") &&
        i.age < 40
    )
});

console.log(result);
// Returns only "John Smith"

Я нашел функцию по другому вопросу ({ ссылка }), которая позволяет легко проверить вложенные объекты. Я немного изменил его, чтобы проверить наличие вложенных полей.

function get(obj, key){
  return key.split(".").every(function(x) {
        if(typeof obj != "object" || obj === null || ! x in obj || !obj[x])
            return false;
        obj = obj[x];
        return true;
    });
}

let list = [
  {
    name: {
      firstName: 'John', lastName: 'Smith' 
    },
    age: 13
  },
  {
    name: {
      firstName: null, lastName: 'Jones' 
    },
    age: 23
  },
  {
    name: {
      lastName: 'Jones' 
    },
    age: 46
  }
];

let result = list.filter(i => {
    return (
        get(i, "name.firstName") && 
        i.name.firstName.startsWith("J") &&
        i.age < 40
    )
});

console.log(result);
// Returns only "John Smith"

Ссылки:

Необязательные цепочки

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

Функции стрелок - хорошая статья, которую я написал о функциях стрелок

https://dev.to/acroynon/javascript-arrow-functions-explained-3m04

1 голос
/ 29 апреля 2020

без if, вы просто пишете:

&& (r.name !== null)

в вашем выражении, и компилятор примет его, или вы можете использовать фильтр следующим образом:

.filter( (item) => {
  if (whatever_condition) {
    return item;
}
});
0 голосов
/ 29 апреля 2020

Вы можете просто сделать:

Object.keys(result).forEach(key => {
      if (this.filters.searchBy && this.filters.searchBy.length) {
        result[key] = result[key].filter(r => r && 
          (r.id && this.filters.searchBy.includes(r.id)) ||
          (r.name && r.name.includes(this.filters.searchBy)));
      }
    });
0 голосов
/ 29 апреля 2020

Вы пробовали это

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