02.12.2021, 21:02
|
Новичок на форуме
|
|
Регистрация: 02.12.2021
Сообщений: 1
|
|
Помогите пожалуйста, если можно с объяснением
Не могу решить задачу.
Написать функцию, которая принимает в качестве параметра объект и
возвращает массив методов принимаемого объекта.
|
|
02.12.2021, 21:44
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,129
|
|
|
|
02.12.2021, 22:17
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,751
|
|
Сообщение от рони
|
const foo = obj => Object.keys(obj);
|
Ну не....
Это будет массив всех свойств, а нужны методы
const foo = obj => Object.keys(obj).filter(m => typeof obj[m] === 'function')
Но все равно непонятно какие именно методы нужны. Тут вернутся только собственные перечислимые. Еще могут быть и не перечислимые, и методы прототипов... И заданные не строками, а символами (Symbol)... В том числе и в прототипах.
Последний раз редактировалось voraa, 02.12.2021 в 22:21.
|
|
03.12.2021, 02:43
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
Вот те универсальная шляпа.)
/**
* @callback Filter
* @param value
* @param {string | symbol} key
* @param {?object} getset
* @param {?function} getset.get
* @param {?function} getset.set
* @returns {boolean}
*/
/**
* @typedef Options
* @type {object}
* @property {boolean=true} deep
* @property {boolean=true} getters
* @property {boolean=getters} setters
* @property {boolean=false} symbols
* @property {boolean=} enumerable
* @property {boolean=} configurable
* @property {boolean=} writable
*/
/**
* @param {object} obj
* @param {Filter} [filter]
* @param {Options} [options]
* @returns {string[]}
*/
function getPropertyKeys(obj, filter, options) {
if (typeof filter !== 'function') {
options = filter;
filter = (value, key) => true;
}
const {
deep = true,
getters = true,
setters = getters,
symbols = false,
...descriptorOptions
} = options ?? {};
const not = (descriptor, key) => key in descriptorOptions && descriptorOptions[key] !== descriptor[key];
const {
getOwnPropertySymbols,
getPrototypeOf,
getOwnPropertyDescriptors,
keys,
assign,
prototype
} = Object;
let current = obj;
let descriptors;
do {
descriptors = assign(getOwnPropertyDescriptors(current), descriptors);
if (current === prototype) break;
current = getPrototypeOf(current);
} while (deep && current);
let list = keys(descriptors);
if (symbols)
list = list.concat(getOwnPropertySymbols(descriptors));
return list.filter(key => {
const descriptor = descriptors[key];
const { get, set, value } = descriptor;
if (not(descriptor, 'enumerable'))
return false;
if (not(descriptor, 'configurable'))
return false;
if (get || set) {
return (setters || setters)
&& filter(get && get.call(obj), key, { get, set });
}
if (not(descriptor, 'writable'))
return false;
return filter(value, key);
});
}
getPropertyKeys([], value => typeof value === 'function', {
symbols: true
});
__________________
29375, 35
Последний раз редактировалось Aetae, 03.12.2021 в 07:55.
|
|
03.12.2021, 07:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,129
|
|
Aetae,
|
|
03.12.2021, 07:23
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,129
|
|
Aetae,
строки 32 - 34 верно или надо поменять местами?
|
|
03.12.2021, 07:38
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
рони, верно, это была фишка со свапом: [a, b] = [b, a], чтоб типа obj [,filter [, options]]. Я конечно намудрил там излишне, поправил по-человечски.)
__________________
29375, 35
Последний раз редактировалось Aetae, 03.12.2021 в 07:45.
|
|
03.12.2021, 07:40
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,129
|
|
Aetae,
ясно.
|
|
03.12.2021, 07:45
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,751
|
|
Сообщение от Aetae
|
это фишка со свапом: [a, b] = [b, a], чтоб типа obj [,filter [, options]].
|
Ну обычно так делают, если какой то параметр просто можно пропустить.
Либо (object, filter, options)
либо (object, options)
Менять местами - излишество.
Хотя правильнее, наверно, (object, options, filter)
|
|
03.12.2021, 07:47
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,129
|
|
Aetae,
интересная фишка!!! +++
|
|
|
|