将对象的键移动到其值中以创建对象数组

Posted

技术标签:

【中文标题】将对象的键移动到其值中以创建对象数组【英文标题】:moving the key of an object into its value to create an array of objects 【发布时间】:2022-01-21 20:21:54 【问题描述】:

我有一个对象,我想从中构建一个表,但是我需要使用键的值作为显示数据的一部分。我的数据如下所示:


    templates: 
      some_visit_1: 
        template: "A long block or rich text",
        editedAt: "timestamp",
        editedBy: "name",
      ,
      some_visit_2: 
        template: "A different block of rich text",
        editedAt: "timestamp",
        editedBy: "Name",
      ,
    ,
  ,

我试过

let data = result.templates;
const templates = Object.entries(data);

但这给了我嵌套数组,其中键作为一个值,一个对象作为第二个值。我想创建一个对象数组,其中每个对象都包含初始对象内的键和所有值。

更进一步,我认为我可以映射新数组并将数据传播到一个对象中,但这只会导致错误。

const templates = Object.entries(data).map((item, idx) => 
        const values = item[1];
        return 
          ...items,
          items: 
            name: item[0],
            editedAt: item[1].editedAt,
            editedBy: item[1].editedBy,
            template: item[1].template,
          ,
        ;
      );

有没有一种方法可以将一个对象中的键和所有值组合成一个对象?

像这样:

[
   
       
        name: some_visit_1,
        template: "A long block or rich text",
        editedAt: "timestamp",
        editedBy: "name",
      ,
      
        name: some_visit_2,
        template: "A different block of rich text",
        editedAt: "timestamp",
        editedBy: "Name",
      
]

【问题讨论】:

如果您的最外层对象(例如templates2)中有另一个键,并且嵌套对象类似于您现在用于templates 的键,那么您的预期输出是什么,或者这不是可能的情况。您的预期输出当前有一个额外的 会引发语法错误(不确定这是错误的还是您是否打算将您的对象包装在某种容器中?) 【参考方案1】:

这是预期的吗?我用Object.entriesmap

let data = 
  templates: 
    some_visit_1: 
      template: "A long block or rich text",
      editedAt: "timestamp",
      editedBy: "name",
    ,
    some_visit_2: 
      template: "A different block of rich text",
      editedAt: "timestamp",
      editedBy: "Name",
    ,
  ,

let result = Object.entries(data.templates).map(([key, value]) => 
  return 
    name: key,
    ...value,

  
);

console.log(result);

【讨论】:

我第一次看到map(([key, value]) => ,你能解释一下它是如何工作的吗? @Gass Object.entries returns 对象中每个项目的键和值的数组。所以Object.entries 的返回将是一个数组数组,例如:[ [key1, value of key1], [key2, value of key2], [key3, value of key key 3] ] - 在第二条评论中继续 @Gass (cont...) 当我们使用映射时,第一个参数将是由map 迭代的当前元素。所以我们既可以访问.map(item=> ) 之类的元素并通过item[0] 获取密钥,通过item[1] 获取值,也可以使用.map(([key, value])=> ) 之类的方法。这基本上是destructing 数组。 超清晰,谢谢

以上是关于将对象的键移动到其值中以创建对象数组的主要内容,如果未能解决你的问题,请参考以下文章

JS 遍历对象数组并将值更改为匹配的键并创建一个包含对象数组 [0] 中的键的新对象

在 node.js 中为现有对象创建一个新的键和/或数组

是否有对象的`.map`之类的函数?用相同的键创建一个新对象

如何将从(对象检测)裁剪的检测到的面部保存到其特定创建的文件夹中?

将派生对象存储到其基类型的集合中——为啥它会起作用?

mongo db:从对象数组中获取子数组,其值在单个文档的范围内