Я пытаюсь преобразовать объект в массив объектов в javascript

#javascript #arrays #dictionary #object #ecmascript-6

#javascript #массивы #словарь #объект #ecmascript-6

Вопрос:

Вот один объект:

 const language = {
  fluency: {
    "English": "Advanced",
    "French": "Intermediate"
  },
  read: ["English", "French"],
  speak: ["English"],
  write: ["English"]
};
  

И я пытаюсь преобразовать в массив объекта, например:

 const newLanguage = [
    {
        language: "English",
        fluency: "Advanced",
        read: true,
        speak: true,
        write: true,
    },
    {
        language: "French",
        fluency: "Intermediate",
        read: false,
        speak: false,
        write: false,
    }
]
  

Вот результат, который я пробовал:

 var values = Object.entries(language).map(([k, v]) => ({[k]: v}))
  

И это результат:

 [
  { fluency: { English: 'Advanced', French: 'Intermediate' } },
  { read: [ 'English', 'French' ] },
  { speak: [ 'English' ] },
  { write: [ 'English' ] }
]
  

P.S
Я не прошу код, но если бы кто-нибудь мог дать мне шаги для преобразования в результат, это было бы большой помощью!
Заранее спасибо!

Ответ №1:

Вы можете воспользоваться оператором распространения и отделить беглость от других свойств, а затем использовать .map() для создания массива объектов на основе извлеченных значений беглости. Array.reduce можно использовать для создания объекта на основе свойств из rest переменной:

 const language = {
  fluency: {
    "English": "Advanced",
    "French": "Intermediate"
  },
  read: ["English", "French"],
  speak: ["English"],
  write: ["English"]
};


let {
  fluency,
  ...rest
} = language;

let result = Object.entries(fluency).map(([lang, flue]) =>
  Object.keys(rest)
  .reduce((obj, skill) => {
    obj[skill] = rest[skill].includes(lang);
    return obj;
  }, {
    language: lang,
    fluency: flue
  })
);

console.log(result);  

Комментарии:

1. Спасибо за помощь! 🙂

Ответ №2:

Вы можете сделать что-то вроде приведенного ниже

 const language = {
  fluency: {
    "English": "Advanced",
    "French": "Intermediate"
  },
  read: ["English", "French"],
  speak: ["English"],
  write: ["English"]
};

const newLanguage = []

for (const [key, value] of Object.entries(language.fluency)) {
  newLanguage.push({
        language: key,
        fluency: value,
        read: language.read.includes(key),
        speak: language.speak.includes(key),
        write: language.write.includes(key),
    });
}

console.log(newLanguage);  

Комментарии:

1. Спасибо за помощь! 🙂