Как получить объект в объекте по строковому ключу в filter методе?

Ссылка скопирована
21 января 2026 1 ответ
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
Андрей PHP Ответ

Для того чтобы получить объект в объекте по строковому ключу в методе 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';
}

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 принимает объект и строковый ключ, перебирает все ключи объекта и их значения. Если значение по найденному ключу является объектом, то функция возвращает это значение. Если значение по найденному ключу не является объектом, то функция рекурсивно вызывает саму себя для поиска объекта во вложенном объекте.

Надеюсь, это поможет вам решить вашу проблему! Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно