У меня есть объект ответа, из которого я хочу извлечь все значения 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
, как предложено ниже.
Вы можете использовать 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' ]
Если вы не знаете глубину или если глубина может измениться, вам, скорее всего, понадобится рекурсивная функция.