Извлечение значений из массивов в

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

🤔 А знаете ли вы, что...
JavaScript можно использовать для создания ботов и автоматизации задач в браузерах с помощью Puppeteer.


62
4

Ответы:

Решено

Вы можете использовать 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' ]