Дополнительные функции 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