У меня есть объект ответа, из которого я хочу извлечь все значения id, но я не уверен, что это лучший способ сделать это...
const obj = {
"responseArray":[
{
"accounts":[
{
"products":[
{
"id":"123",
}
]
},
{
"products":[
{
"id":"456",
}
]
}
]
},
{
"accounts":[
{
"products":[
{
"id":"987",
}
]
},
{
"products":[
{
"id":"654",
}
]
}
]
}
]
}
Самое близкое, что я получил, это картографирование
const mapped = obj.responseArray.map(item => item?.accounts.map(acc => acc.products.map(prod => prod.id)))
// Response
// [ [ [Array], [Array] ], [ [Array], [Array] ] ]
Эти Array биты на самом деле содержат нужные мне идентификаторы, просто они явно не в том формате, который мне нужен...
Этот вопрос похож на: Как я могу получить доступ и обработать вложенные объекты, массивы или JSON?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.
Каково ваше предполагаемое использование вывода? Если вам просто нужен массив идентификаторов, вы можете использовать reduce() или flatMap(). Если вы хотите выполнить действие на основе других свойств внутри каждого товара, используйте механизм цикла — подойдет любой.
@RoryMcCrossan, действительно, мне просто нужен был массив идентификаторов. Я рассматривал reduce, но использовал его недостаточно, чтобы быть уверенным в этом. В итоге я использовал flatMap, как предложено ниже.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать FlatMap, чтобы получить простой массив вместо массива массивов:
const obj = {
"responseArray":[
{
"accounts":[
{
"products":[
{
"id":"123",
}
]
},
{
"products":[
{
"id":"456",
}
]
}
]
},
{
"accounts":[
{
"products":[
{
"id":"987",
}
]
},
{
"products":[
{
"id":"654",
}
]
}
]
}
]
}
const mapped = obj.responseArray.flatMap(item => item?.accounts.flatMap(acc => acc.products.map(prod => prod.id)))
console.info(mapped)Гений! Я задавался вопросом, существует ли что-то подобное, хаха
С помощью «современных» (Chrome 69, Firefox 62, Edge 79, Opera 56, Safari 12) версий JavaScript вы можете Array.prototype.flatMap:
obj.responseArray
.flatMap(x => x.accounts)
.flatMap(x => x.products)
.map(x => x.id)
// [ '123', '456', '987', '654' ]
flatMap принимает функцию, которая возвращает массив, и сопоставляет все массивы этой функции в один большой массив, который затем можно обрабатывать дальше.
Я использую forEach для выполнения работы.
const obj = {
"responseArray": [{
"accounts": [{
"products": [{
"id": "123",
}]
},
{
"products": [{
"id": "456",
}]
}
]
},
{
"accounts": [{
"products": [{
"id": "987",
}]
},
{
"products": [{
"id": "654",
}]
}
]
}
]
}
let result=[];
obj.responseArray.forEach(o=>{
o.accounts.forEach(account=>{
account.products.forEach(product=>{
result.push(product.id);
})
})
})
console.info(result)Я думаю, вы ищете что-то вроде этого, Нам нужно использовать FlatMap для выравнивания и сопоставления массивов:
obj.responseArray
.flatMap(item => item.accounts)
.flatMap(account => account.products)
.map(product => product.id);
// response: [ '123', '456', '987', '654' ]
Если вы не знаете глубину или если глубина может измениться, вам, скорее всего, понадобится рекурсивная функция.