Sobes.tech
Back to questions
Middle+
3

export function foo(o, arr) { return arr.reduce((a, x) => { // if (o.hasOwnProperty(x)) a[x] = o[x]; if (o[x]) a[x] = o[x]; return a; }, {}); } const obj = {a: 's'} foo(obj, ['a'])

Companies where asked
Mayflower

Answer from AI

sobes.tech AI

В функции foo происходит фильтрация объекта o по ключам из массива arr. Важно различать две проверки:

  • o.hasOwnProperty(x) проверяет, есть ли у объекта собственное свойство с именем x, включая свойства со значением undefined или null.
  • if (o[x]) проверяет истинность значения свойства, то есть свойства с ложными значениями (0, false, null, undefined, '') будут проигнорированы.

В вашем примере:

const obj = {a: 's'};
foo(obj, ['a']); // { a: 's' }

Если заменить условие на if (o.hasOwnProperty(x)), то функция будет копировать все свойства, даже если их значение ложное. Это более корректно, если нужно именно проверить наличие свойства, а не его значение.

Пример:

const obj = {a: 0, b: false, c: null};
foo(obj, ['a', 'b', 'c']);
// с hasOwnProperty: { a: 0, b: false, c: null }
// с if(o[x]): {} (потому что 0, false, null — ложные)

Рекомендуется использовать hasOwnProperty для проверки наличия свойства, если важны все значения.