Как перебирать вложенные объекты и комбинировать ключ и значение?

const products = {
  value: {
    phone: [],
    lamp: [],
    car: ["bmw", "toyota", "audi"]
  }
};

В данном объекте я хочу повторить и получить keys.
Обратите внимание, что values есть array of strings.

Я хотел бы получить все ключи, и если значения не являются пустыми массивами, я хочу объединить их с ключами и вернуть массив с этой структурой

   [
    phone,
    lamp,
    car-bmw,
    car-toyota,
    car-audi
  ]

Вот что я сделал до сих пор, чего я не хочу

const products = {
  value: {
    phone: [],
    lamp: [],
    car: ["bmw", "toyota", "audi"]
  }
};

const mappedProducts = Object.entries(products.value).map(([value, items]) => {
  //console.info("value :", value, "items :", items)
  if (items.length > 0) {
    return {
      car: items.map((c) => c)
    };
  }
});

console.info(mappedProducts);

Любая помощь будет оценена.

Поведение ключевого слова "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
0
47
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать цикл for in

const products = {
  value: {
    phone: [],
    lamp: [],
    car: ["bmw", "toyota", "audi"]
  }
};

const newData = [];

for (const key in products) {
  const value = products[key];

  for (const innerKey in value) {
    const innerVal = value[innerKey];
    if (innerVal.length > 0) {
      innerVal.forEach((item) => newData.push(`${innerKey}-${item}`));
    } else {
      newData.push(innerKey);
    }
  }
}

console.info(newData);

Другим решением было бы использовать Object.keys() вместе с map и concat для получения объединенного массива с ключами и значениями (если они есть):

const products = {
  value: {
    phone: [],
    lamp: [],
    car: ["bmw", "toyota", "audi"]
  }
};

let keys = [].concat.apply([], Object.keys(products.value).map((key) =>{
    if (products.value[key].length > 0){
    return products.value[key];
  }
  else return key;
}));
console.info(keys);
Ответ принят как подходящий

Я немного изменил то, что вы сделали, вы можете flatMap

const products = {
  value: {
    phone: [],
    lamp: [],
    car: ["bmw", "toyota", "audi"]
  }
};

const mappedProducts = Object.entries(products.value).flatMap(([value, items]) => {
  //console.info("value :", value, "items :", items)
  if (items.length > 0) {
    return items.map(item => `${value}-${item}`);
  } else {
    return [value];
  }
});

console.info(mappedProducts);

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