将字典转换为数组并保留字典键

4

我希望找到一种更加优雅的方式将一个字典嵌套字典转换为一个字典数组,并保留原始字典键的信息。

以以下情况为例:

let data= { boss: { name:"Peter", phone:"123"},
            minion: { name:"Bob", phone:"456"},
            slave: { name:"Pat", phone: "789"} 
          }

我希望能想出一些能给我带来

output = [ { role:"boss", name:"Peter", phone:"123"},
           { role:"minion", name:"Bob", phone:"456"},
           { role:"slave", name:"Pat",  phone:"789"}
         ]

我的解决方案是使用Object.keys方法,但我认为它不是很高效。有些东西告诉我我可能走了一条复杂的路,肯定有更简单的方法,但我不知道怎么做。
 Object.keys(data)
                .map((elem, i) => {
                    return Object.assign({role: e}, Object.values(data)[i]);
                })

这是否是我想要实现的最简单方法?

谢谢


1
你可以使用 const output = Object.entries(data).map(({ role, value) => ({ ...value, role })); - user5734311
3个回答

7
你可以映射这些条目并选择一个新对象的键/角色。

let data = { boss: { name: "Peter", phone: "123" }, minion: { name: "Bob", phone: "456" }, slave: { name: "Pat", phone: "789" } },
    result = Object.entries(data).map(([role, values]) => ({ role, ...values }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


非常好的答案,与另一个答案非常相似,但我想完全理解:我们在哪里明确指定角色的键将是“role”?在“lambda”的输入中([role,values]),我们正在提供一个普通字符串作为角色...它如何转换为输出字典的键? - ggonmar
1
变量 role 在对象中被用作简写属性 - Nina Scholz

1
使用Object.entries,您可以将[key, value]对作为数组获取,并可以使用Array.map函数获得所需结果。

let data = {
  boss: { name:"Peter", phone:"123"},
  minion: { name:"Bob", phone:"456"},
  slave: { name:"Pat", phone: "789"}
};

const result = Object.entries(data).map(([key, value]) => ({
  role: key,
  ...value
}));
console.log(result);


0
你可以使用 Array.prototype.reduceObject.entries 来循环遍历字典中的每个条目,并将其减少为一个数组:

const data = { boss: { name: "Peter", phone: "123" }, minion: { name: "Bob", phone: "456" }, slave: { name: "Pat", phone: "789" } };

function getArray(data) {
  return Object.entries(data).reduce((a, [k, v]) => {
    a.push({role: k, ...v});
    return a;
  }, []);
}
console.log(getArray(data));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接