Как получить объект в объекте по строковому ключу в filter методе?
const logger = require('node-color-log'); class Args { available = { '--test': { isValueRequired: true, }, }; passed = []; names = []; constructor() {} listen = () => { this.passed = process.argv.slice(2); // получаю массив аргументов и удаляю первые два. this.names = this.passed.filter((_) => _.indexOf('--') > -1); // фильтрую переданные значения чтобы получить содержащие "--" и получаю список имён аргументов. logger.debug(this.names); // ['--test'] this.names.filter((name) => { logger.debug(typeof name); // string logger.debug(name); // --test logger.debug(this.available[name]); // undefined logger.debug(this.available['--test']); // {"isValueRequired": "true"} logger.debug(this); // this здесь всё ок, доступ к this.available есть return !this.available[name].isValueRequired; }); return this; }; get available() { return this.available; } } const args = new Args(); args.listen(); |
const logger = require('node-color-log'); class Args { available = { '--test': { isValueRequired: true, }, }; passed = []; names = []; constructor() {} listen = () => { this.passed = process.argv.slice(2); // получаю массив аргументов и удаляю первые два. this.names = this.passed.filter((_) => _.indexOf('--') > -1); // фильтрую переданные значения чтобы получить содержащие "--" и получаю список имён аргументов. logger.debug(this.names); // ['--test'] this.names.filter((name) => { logger.debug(typeof name); // string logger.debug(name); // --test logger.debug(this.available[name]); // undefined logger.debug(this.available['--test']); // {"isValueRequired": "true"} logger.debug(this); // this здесь всё ок, доступ к this.available есть return !this.available[name].isValueRequired; }); return this; }; get available() { return this.available; } } const args = new Args(); args.listen();
Ошибка:
Arguments.js:102 return !this.available[name].isValueRequired ^ TypeError: Cannot read properties of undefined (reading 'isValueRequired') |
Arguments.js:102 return !this.available[name].isValueRequired ^ TypeError: Cannot read properties of undefined (reading 'isValueRequired')
Node.js v20.11.0
Загрузил на песок, там работает: https://stackblitz.com/edit/node-xygtcf?file=index.js
Выполнить: node index.js --test 123
❯ node -v
v18.18.0
Дополнительно:
Очевидно, что входящий --test и --test в объекте не равны. Пробелы там, спецсимволы, ещё что-то. Другого варианта просто нет.
- Я обновил имена аргументов, а передавал старые имена, из-за еле-видного цвета, не заметил, спасибо!
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для того чтобы получить объект в объекте по строковому ключу в методе filter, можно воспользоваться следующим подходом:
1. Перебрать все ключи объекта, чтобы найти нужный ключ.
2. Проверить, является ли значение по найденному ключу объектом.
3. Если значение по найденному ключу является объектом, то вернуть это значение.
Пример кода на PHP:
function getObjectByStringKey($obj, $key) { foreach ($obj as $objKey => $value) { if ($objKey === $key) { if (is_object($value)) { return $value; } } elseif (is_object($value)) { $result = getObjectByStringKey($value, $key); if ($result !== null) { return $result; } } } return null; } $obj = (object) [ 'foo' => 'bar', 'baz' => (object) [ 'qux' => 'quux' ] ]; $key = 'qux'; $result = getObjectByStringKey($obj, $key); if ($result !== null) { var_dump($result); } else { echo 'Object not found'; }
В данном примере функция getObjectByStringKey принимает объект и строковый ключ, перебирает все ключи объекта и их значения. Если значение по найденному ключу является объектом, то функция возвращает это значение. Если значение по найденному ключу не является объектом, то функция рекурсивно вызывает саму себя для поиска объекта во вложенном объекте.
Надеюсь, это поможет вам решить вашу проблему! Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.