我有一个对象,有一些名字作为键,每个键都有一个技能数组,我必须返回一个新对象,技能作为新键,旧键作为数组

人气:471 发布:2022-10-16 标签: javascript object key javascript-objects

问题描述

我有一个类似于此的对象

const list = {
    jhon: ['js', 'java'],
    sara: ['js', 'python'],
    andy: ['ruby', 'js', 'java'],
    sean: ['python', 'ruby']
}

我必须修改它才能显示此内容

newList = {
    js: ['jhon', 'sara', 'andy'],
    java: ['jhon', 'andy'],
    ruby: ['andy', 'sean'],
    python: ['sean', 'sara']
}

我尝试了很多方法都没有成功,预先感谢您的帮助

推荐答案

您可以使用Object.entries、reduce和forEach轻松实现此结果。

因为Object.entries将返回[key, value]的数组。然后,在Reduce中,您可以使用forEach设置对象的属性(在本例中为acc)。

const list = {
  jhon: ["js", "java"],
  sara: ["js", "python"],
  andy: ["ruby", "js", "java"],
  sean: ["python", "ruby"],
};

const result = Object.entries(list).reduce((acc, curr) => {
  const [key, values] = curr;
  values.forEach((lang) => {
    if (acc[lang]) acc[lang].push(key);
    else acc[lang] = [key];
  });
  return acc;
}, {});

console.log(result);

您可以使上面的代码简洁

const list = {
  jhon: ["js", "java"],
  sara: ["js", "python"],
  andy: ["ruby", "js", "java"],
  sean: ["python", "ruby"],
};

const result = Object.entries(list).reduce((acc, [key, values]) => {
  values.forEach((lang) => (acc[lang] = [...(acc[lang] ?? []), key]));
  return acc;
}, {});

console.log(result);

385