Проверка «неопределенного» или «нулевого» любого объекта - PullRequest
0 голосов
/ 02 октября 2018

Я работаю над проектом Angular, и время от времени я проверял undefined или null объекта или его свойств.Обычно я использую lodash _.isUndefined(), см. Пример ниже:

this.selectedItem.filter(i => {
    if(_.isUndefined(i.id)) {
      this.selectedItem.pop();
    }
})

Я не вижу никаких проблем с ним.Но у меня была дискуссия с моим коллегой во время просмотра кода выше.Он говорил мне, что если i получает undefined перед оператором if, то оно выдаст исключение.Вместо этого он предложил мне всегда проверять i или i.id следующим образом:

if(!!i && !!i.id) {
      this.selectedItem.pop();
}

Я убежден в том, что он пытался сказать, в отличие от его способа проверки undefined в приведенном выше коде.Но потом я подумал, какова цель lodash _.isUndefined?

Может кто-нибудь, пожалуйста, дайте мне знать, каков наилучший или чистый способ сделать это.Потому что для меня !!i && !!i.id вообще не читается.

Заранее большое спасибо.

Ответы [ 9 ]

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

Вы можете использовать lodash # get (он будет обрабатывать, если корень имеет значение null или undefined), а затем сравнивать вывод с нулем, используя == или != вместо === или !==.если вывод null или undefined, то сравнение с == будет истинным, а != будет ложным.

const selectedItem = [
  undefined,
  {},
  {id: null},
  { id: 5 },
  undefined,
  { id: 0 },
  { id: 7 },
];

const res = selectedItem.filter(a => _.get(a, 'id') != null);

console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

с помощью lodash # get вы можете проверить на любой вложенный уровень его существование без последующих &&, таких как a && a.b && a.b.c && a.b.c.d (в случае, еслииз d) посмотрите на мой ответ для проверки вложенного уровня с помощью lodash # get

Также вы можете использовать _.isNill вместо сравнения с null будет == или !=

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

Еще один более "лодашный" подход - использовать _. Conforms .На мой взгляд, читаемость намного лучше, и вы получаете доступ непосредственно к id, поэтому никаких проблем с undefined до этого не было:

const items = [
  undefined,
  { id: null},
  { id: 5 },
  { id: "4" },
  { id: undefined },
  undefined,
  { id: 0 },
  { id: 7 },
  { id: () => 3 }
];

const numbersOnly = _.filter(items, _.conforms({'id': _.isNumber}));
console.log('numbers', numbersOnly);

const allDefined = _.filter(items, _.conforms({'id': _.negate(_.isUndefined)}));
console.log('defined', allDefined);

const stringsOnly = _.filter(items, _.conforms({'id': _.isString}));
console.log('strings', stringsOnly);

const functionsOnly = _.filter(items, _.conforms({'id': _.isFunction}));
console.log('functions', functionsOnly);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 02 октября 2018

Вы можете использовать _.isNil() для обнаружения undefined или null.Поскольку вы используете Array.filter(), вы хотите вернуть результаты !_.isNil().Так как i должен быть объектом, вы можете использовать !_.isNil(i && i.id).

Примечание: вы используете Array.filter() как Array.forEach().Обратный вызов Array.filter() должен возвращать логическое значение, а результатом фильтра будет новый массив.

const selectedItem = [
  undefined,
  {},
  { id: 5 },
  undefined,
  { id: 7 },
];

const result = selectedItem.filter(i => !_.isNil(i && i.id));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Вы также можете использовать _.reject() и сохранить необходимость добавления !:

const selectedItem = [
  undefined,
  {},
  { id: 5 },
  undefined,
  { id: 7 },
];

const result = _.reject(selectedItem, i => _.isNil(i && i.id));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 02 октября 2018

let words = [null, undefined, 'cheaters', 'pan', 'ear', 'era']

console.log(words.filter(word => word != null));
0 голосов
/ 02 октября 2018

Могу ли я предложить проверить if(typeof(element) == "number" && element) {} В этом случае часть typeof() перехватывает любые не числа, а часть element должна перехватывать любые NaN s (typeof(NaN) возвращает "число")

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

Ссылка на переменную, значение которой равно undefined, не выдаст никакой ошибки.Вы получаете ReferenceError для ссылки на переменную, которая не определена :

> i
Uncaught ReferenceError: i is not defined

Если вы передаете неопределенную переменную в функцию, выдается ReferenceError и функцияне будет выполнен

> _.isUndefined(i)
Uncaught ReferenceError: i is not defined

typeof оператор должен использоваться для безопасной проверки, определена ли переменная:

> typeof i
'undefined'

В вашем коде определено i (это аргумент функции), поэтому, ссылаясь на него, вы не получите ReferenceError.Код будет выдавать TypeError, если определено i, имеет undefined значение , и вы рассматриваете его как объект:

> var i = undefined; i.id
Uncaught TypeError: Cannot read property 'id' of undefined
0 голосов
/ 02 октября 2018

Вы можете проверить на i, и если это неверно или если свойство undefined или null, то сделать что-то.

if (!i || i.id === undefined || i.id === null) {
    this.selectedItem.pop();
}
0 голосов
/ 02 октября 2018

Твой друг прав.Когда вы делаете, _.isUndefined(i.id) вы предполагаете i, чтобы не быть undefined.Вы предполагаете, что i - это объект, который будет иметь свойство id, которое вы проверяете, является ли оно falsey или нет.

Что происходит, когда само по себе undefined?Таким образом, вы в конечном итоге undefined.id, что является ошибкой.Поэтому вы можете просто сделать это

if(i && i.id) {
  // You're good to go
}

. Выше будет проверено все значения falsey , включая 0 и "".Поэтому, если вы хотите быть очень конкретным, вам придется проверить оба типа, используя оператор typeof.

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

Используйте typeof i.id === 'undefined' для проверки undefined и i.id === null для проверки null.

Вы можете написать свои собственные вспомогательные функции, чтобы обернуть любую логику, например, в LoDash.Условие с !!i && !!i.id ищет только ложные значения (пустая строка, 0 и т. Д.), А не только null или undefined.

...