#javascript #typescript
Вопрос:
Я хочу повторить вложенные ключи объектов, которые также будут иметь вложенные внутренние дочерние элементы:
Вложенный объектный код:
{
"F2C3C496-BEA6-A5E8-15F0-E2867304B463": {
"D39FD497-9529-6CC3-70DE-E8D9277C18D3": {
"child": {
"87A1817D-CFA9-70FD-131B-224658AF13CE": {
"next": {
"F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A": {}
}
}
},
"next": {
"B49927ED-369E-E219-FC1A-8E4BAAFC3933": {
"next": {}
}
}
}
}
}
Код JS для итерации:
flowThrough = (obj, callback, context?, path?: string) => {
let nestedKey=';'
Object.keys(obj).forEach(key => {
if(!isEmptyObject(key))
callback(key, context, path);
if (!isEmpty(obj[key]) amp;amp; typeof obj[key] === 'object') {
if(obj[key].hasOwnProperty('next'))
nestedKey = obj[key].next;
else if(obj[key].hasOwnProperty('child'))
nestedKey = obj[key].child;
else nestedKey = obj[key];
this.flowThrough(nestedKey, callback, context, (path)? has(context, path.concat(".next"))?path.concat(`.next[${get(context, path.concat(".next").length)}]`): path.concat('.').concat("next[0]") : key)
}
})
}
На самом деле, приведенный выше код работает для одного вложенного уровня, чтобы получить ключ(идентификаторы). Если он достигает пустого ключа объекта, то цикл на этом заканчивается. на самом деле, он должен проверить, есть ли там другой ребенок/следующий или нет.
Ожидаемый результат:
{ "flow": [
{
"id": "F2C3C496-BEA6-A5E8-15F0-E2867304B463",
"next": [
{
"id": "D39FD497-9529-6CC3-70DE-E8D9277C18D3",
"child": [
{
"id": "87A1817D-CFA9-70FD-131B-224658AF13CE",
"next": [
{
"id": "F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A",
"next": []
}
]
}
],
"next": [
{
"id": "B49927ED-369E-E219-FC1A-8E4BAAFC3933",
"next": []
}
]
}
]
}
]
}
Пожалуйста, дайте мне решение для этого.
Комментарии:
1. какова цель итерации, что вы пытаетесь извлечь — каков ожидаемый результат?
2. @Kinglish — я добавил ожидаемые результаты. чтобы получить все идентификаторы
3. Необходимо более точное описание возможной формы
obj
. Например, может ли быть более одногоid
ключа на каждом уровне вложенности?4. @MikeM Да, у него также будет более одного идентификатора
5. @MikeM — есть какое-нибудь решение ?
Ответ №1:
let obj = {
"F2C3C496-BEA6-A5E8-15F0-E2867304B463": {
"D39FD497-9529-6CC3-70DE-E8D9277C18D3": {
"child": {
"87A1817D-CFA9-70FD-131B-224658AF13CE": {
"next": {
"F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A": {}
}
}
},
"next": {
"B49927ED-369E-E219-FC1A-8E4BAAFC3933": {
"next": {}
}
}
}
}
}
const setObj = e => {
let tmp = {}
if (Array.isArray(e[0])) e = e[0]
if (typeof e[0] === 'string' amp;amp; e[0].split('-').length === 5) {
tmp = {
id: e[0],
next: setObj(Object.entries(e[1]))
};
} else if (e[1]) {
tmp = {
child: setObj(Object.entries(e[1]))
};
}
return tmp
}
let newobj = Object.entries(obj).map(setObj)[0]
console.log(newobj)
Оригинальный ответ…
Вот один из способов сделать это. Используйте рекурсивную функцию вместе с Object.entries для сбора данных. Я обнаружил, что в результате получилась серия вложенных массивов идентификаторов, поэтому я расплющил их все, join()
а затем снова разделил. Наконец, filter()
помогло удалить пустые индексы массивов
let obj = {
"F2C3C496-BEA6-A5E8-15F0-E2867304B463": {
"D39FD497-9529-6CC3-70DE-E8D9277C18D3": {
"child": {
"87A1817D-CFA9-70FD-131B-224658AF13CE": {
"next": {
"F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A": {}
}
}
},
"next": {
"B49927ED-369E-E219-FC1A-8E4BAAFC3933": {
"next": {}
}
}
}
}
}
const getKeys = e => {
let ret = []
if (e[0].split('-').length === 5) ret.push(e[0]);
if (e[1]) ret.push(Object.entries(e[1]).map(getKeys))
return ret.join(',')
}
let keys = Object.entries(obj).map(getKeys)[0].split(",").filter(e => e)
console.log(keys)
Комментарии:
1. на самом деле, мне нужно, чтобы с вложенным уровнем здесь вы читали все идентификаторы одним коротким. Чтобы дать вам больше ясности, мне нужен идентификатор на каждой итерации. причина, по которой мне это нужно, заключается в том, что я должен выполнить обратный вызов с этим идентификатором ( требуется уровень вложенности).
2. можете ли вы дословно показать ожидаемый результат в своем вопросе?
3. 1-я итерация —> F2C3C496-BEA6-A5E8-15F0-E2867304B463 2-я итерация—>>D39FD497-9529-6CC3-70DE-E8D9277C18D3 3-я итерация —>>> 87A1817D-CFA9-70FD-131B-224658AF13CE 4-я итерация—>>>>F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A для каждой итерации я выполняю обратный вызов, чтобы сформировать вложенный json с различными данными
4. значит, достаточно вернуть уровень с идентификатором? например [{идентификатор:’F7A90266-B7F4-4CC2-0F1B-D4B320E2EC1A’, уровень:4}, …]? или вам нужно вызвать обратный вызов внутри итерации?
5. Мне нужно вызывать обратный вызов внутри каждой итерации. позвольте мне поделиться json, который требуется сформировать после возврата обратного вызова