поиск в дереве объектов в зависимости от значения глубины - PullRequest
0 голосов
/ 04 марта 2019

У меня есть объект, у которого есть случайные ключи и значения других объектов, у которых последняя глубина дерева имеет идентификатор.

Я хочу создать функцию, которая принимает строку и глубину, чтобы получить дочерний объект в зависимости от этих двух значений

Например, у меня есть такие данные:

var treeObj = {
    "random key1": {
        "random key11": {
            "random key11": {
                "random key11": {
                    id: 25,
                    count: 364
                },
                "random key12": {
                    id: 52,
                    count: 644
                },
                "random key13": {
                    id: 5,
                    count: 664
                },
                "random key14": {
                    id: 5,
                    count: 624
                }
            }
        },
        "random key2": {
            "random key21": {
                "random key21": {
                    id: 56,
                    count: 64
                }
            },
            "random key22": {
                "random key221": {
                    id: 56,
                    count: 64
                },
                "random key222": {
                    id: 35,
                    count: 64
                }
            },
        }
    },
    "other random key":{
        "different random key":{
            "different random key": {
                "different random key1": {
                    id: 75,
                    count: 664
                },
                "different random key2": {
                    id: 57,
                    count: 624
                },
                "different random key3": {
                    id: 50,
                    count: 654
                },
            },
        },
        "different random key2":{
            "different random key2": {
                "different random key21": {
                    id: 15,
                    count: 64
                },
            },
        }
    }
}

что я хочу, это такая функция:

get_child_obj ('random key1', 0)

должна возвращать это:

{
    "random key11": {
        "random key11": {
            "random key11": {
                id: 25,
                count: 364
            },
            "random key12": {
                id: 52,
                count: 644
            },
            "random key13": {
                id: 5,
                count: 664
            },
            "random key14": {
                id: 5,
                count: 624
            }
        }
    },
    "random key2": {
        "random key21": {
            "random key21": {
                id: 56,
                count: 64
            }
        },
        "random key22": {
            "random key221": {
                id: 56,
                count: 64
            },
            "random key222": {
                id: 35,
                count: 64
            }
        },
    }
}

и подобную функцию:

get_child_obj('different random key', 2)

должен возвращать это:

{
    "different random key1": {
        id: 75,
        count: 664
    },
    "different random key2": {
        id: 57,
        count: 624
    },
    "different random key3": {
        id: 50,
        count: 654
    },
}

и такая функция:

get_child_obj('random key12', 3)

должна возвращать это:

{
    id: 52,
    count: 644
}

обратите внимание, что для каждой глубины ключ уникален.

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете воспользоваться рекурсивным подходом, передав объект для поиска и уменьшив глубину для каждого вложенного уровня.

Если depth равно нулю, вернуть требуемое свойство, в противном случае выполнить итерацию значений объектаи проверьте, содержит ли вложенный объект свойство wanted.

function getChild(object, key, depth) {
    var result;
    return depth
        ? (Object.values(object).some(v => result = getChild(v, key, depth - 1)), result)
        : object[key];
}

var tree = { "random key1": { "random key11": { "random key11": { "random key11": { id: 25, count: 364 }, "random key12": { id: 52, count: 644 }, "random key13": { id: 5, count: 664 }, "random key14": { id: 5, count: 624 } } }, "random key2": { "random key21": { "random key21": { id: 56, count: 64 } }, "random key22": { "random key221": { id: 56, count: 64 }, "random key222": { id: 35, count: 64 } } } }, "other random key": { "different random key": { "different random key": { "different random key1": { id: 75, count: 664 }, "different random key2": { id: 57, count: 624 }, "different random key3": { id: 50, count: 654 } } }, "different random key2": { "different random key2": { "different random key21": { id: 15, count: 64 } } } } };

console.log(getChild(tree, 'random key1', 0));
console.log(getChild(tree, 'different random key', 2));
console.log(getChild(tree, 'random key12', 3));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...