如何从较大的对象中定义较小的对象?

问题描述

我正在使用的数据结构:

this.theDataStructureIHave = [
  {
    "1304": {
      "id": 6458,"data": "Data1","created_at": "2020-10-20 23:16:38","updated_at": "2020-10-20 23:16:38"
    },"1305": {
      "id": 6459,"data": "Data2","1306": {
      "id": 6460,"data": "Data3","1307": {
      "id": 6461,"data": "1227","1308": {
      "id": 6462,"data": "12256","header": null,"id": 500
  },{
    "1304": {
      "id": 6463,"data": "Data4","1305": {
      "id": 6464,"data": "Data5","1306": {
      "id": 6465,"data": "Data6","1307": {
      "id": 6466,"data": "3574","1308": {
      "id": 6467,"data": "25824","id": 501
  },{
    "1304": {
      "id": 6468,"data": "Data7","1305": {
      "id": 6469,"data": "Data8","created_at": "2020-10-20 23:16:39","updated_at": "2020-10-20 23:16:39"
    },"1306": {
      "id": 6470,"data": "Data9","1307": {
      "id": 6471,"data": "3061","1308": {
      "id": 6472,"data": "26696","id": 502
  }
]

我要实现的数据结构:

this.theResultIWant = [
  {
    "1304": {
      "id": 6458,"updated_at": "2020-10-20 23:16:38"
    }
  },}
]

总而言之,我有一个包含两个对象的数组,并且在这些对象内有更多对象(this.theDataStructureIHave)。

从该数据结构开始,我想创建一个对象的新数组,该数组本质上包含this.theDataStructureIHave中的某些元素。

在这里我还有一个数字数组:[1304,1306]。说这已分配给变量arrayOfNumbers = [1304,1306]

我想要的最终结果是通过this.theDataStructureIHave过滤并检索索引等于1304和1306的对象。arrayOfNumbers是一个动态值(这只是一个示例),在代码中看起来像这样:

this.arrayOfNumbers = this.someObject.columns.map(Number);

是否有办法实现这一目标并从this.theDataStructureIHave获得theResultIWant?没有硬编码值?

对于我想要实现的数据结构,请参见codepen的底部,名为this.theResultIWant

解决方法

请注意,根据输入的不同,此解决方案并不安全。如果输入数据不正确,也不会引发异常。

工作原理:

  1. 我们正在映射数据结构IHave,即将该数组中的每个externalObject更改为其他对象
  2. Object.entries(outerObject)为我们提供了该对象的键和值对(类似[[key1,value1],[key2,value2],[key3,value3]]
  3. 我们根据密钥是否包含在filter中来arrayOfNumbers。请注意,数组具有整数,并且对象具有键作为字符串,因此需要parseInt。如果您对([key,_])感到困惑-这是一个数组解构,即它使用[key,val]数组并分别给我们keyvalue(我没有使用,所以我将其命名为_),否则我们将使用类似(keyValuePair)的名称,然后将键引用为keyValuePair[0]
  4. Object.fromEntries(...)基于键/值对构造一个对象

const theDataStructureIHave = [{
    "1304": {
      "id": 6458,"data": "Data1","created_at": "2020-10-20 23:16:38","updated_at": "2020-10-20 23:16:38"
    },"1305": {
      "id": 6459,"data": "Data2","1306": {
      "id": 6460,"data": "Data3","1307": {
      "id": 6461,"data": "1227","1308": {
      "id": 6462,"data": "12256","header": null,"id": 500
  },{
    "1304": {
      "id": 6463,"data": "Data4","1305": {
      "id": 6464,"data": "Data5","1306": {
      "id": 6465,"data": "Data6","1307": {
      "id": 6466,"data": "3574","1308": {
      "id": 6467,"data": "25824","id": 501
  },{
    "1304": {
      "id": 6468,"data": "Data7","1305": {
      "id": 6469,"data": "Data8","created_at": "2020-10-20 23:16:39","updated_at": "2020-10-20 23:16:39"
    },"1306": {
      "id": 6470,"data": "Data9","1307": {
      "id": 6471,"data": "3061","1308": {
      "id": 6472,"data": "26696","id": 502
  }
]

const arrayOfNumbers = [1304,1306];

const result = theDataStructureIHave.map(outerObject =>
  Object.fromEntries(Object.entries(outerObject).filter(([key,_]) => arrayOfNumbers.includes(parseInt(key))))
);

console.log(result)