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

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

Если вы не знаете глубину или если глубина может измениться, вам, скорее всего, понадобится рекурсивная функция.

dbzx10299 05.07.2024 10:06

Этот вопрос похож на: Как я могу получить доступ и обработать вложенные объекты, массивы или JSON?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

jabaa 05.07.2024 10:08

Каково ваше предполагаемое использование вывода? Если вам просто нужен массив идентификаторов, вы можете использовать reduce() или flatMap(). Если вы хотите выполнить действие на основе других свойств внутри каждого товара, используйте механизм цикла — подойдет любой.

Rory McCrossan 05.07.2024 10:11

@RoryMcCrossan, действительно, мне просто нужен был массив идентификаторов. Я рассматривал reduce, но использовал его недостаточно, чтобы быть уверенным в этом. В итоге я использовал flatMap, как предложено ниже.

physicsboy 05.07.2024 10:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
62
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Гений! Я задавался вопросом, существует ли что-то подобное, хаха

physicsboy 05.07.2024 10:23

С помощью «современных» (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' ]

Другие вопросы по теме