【问题标题】:How to push selected objects from an array of objects into one array of objects如何将选定对象从一组对象推入一个对象数组
【发布时间】:2020-12-19 05:16:55
【问题描述】:

我有这个对象,它有很多元素,比如数组中的几个其他对象。

有两个数组:

对象数组1:

里面是这样的:

子表单和部分

层次结构是:

[0]--
title
     |
     section [
             properties|
                       [[***target***]]
                                       |
                                       title
     ]
     subform [
             properties|
                       [[***target***]]
                                       |
                                       title
     ]
[1]--
     |
     section [
             properties|
                       [[***target***]]
                                       |
                                       title
     ]
     subform [
             properties|
                       [[***target***]]
                                       |
                                       title
     ]

我正在尝试做的是有选择地选择这样的标题:

我像这样实例化私有 obj:

private obj = {
  data: [{
    subform: '',
    section: '',
    field: ''
  }]
};

并运行 for/next 循环来填充 obj OBJECT

    for (let i = 0; i < this.dataTableJSON.length; i++) {
      this.obj.data[i].subform = this.dataTableJSON[i].subform.properties.title;
      this.obj.data[i].section = this.dataTableJSON[i].section.properties.title;
      this.obj.data[i].field = this.dataTableJSON[i].title;
    }

发生的情况是,它大约运行 1 次,然后返回“1”,并在错误控制台中显示:

无法设置未定义的属性“子表单”。

我寻求的结果就是这样:

private obj = {
  data: [{
    subform: 'Title 1',
    section: 'Section Title 1',
    field: 'Field Title 1'
  },{
    subform: 'Title 2',
    section: 'Section Title 2',
    field: 'Field Title 2'
  }]
};

为什么第二次就死了?这太简单了……我正在使用 TYPESCRIPT

DAI 更新:

戴,我 99% 都在那儿……

在实现代码的时候,我写了如下枚举。

export interface DataItem {
   subform: string;
   section: string;
   field: string;
};

export type ObjType = {
  data: DataItem[]
};

这是上面的导入

import {DataItem, ObjType} from '../../../services/datatables-integration-services/datatables-datatypes-enum';

在实际的 component.ts 文件中,我把这个:

 private readonly obj: ObjType = {
    data: []
 };

我按照你说的实现了 for/next 循环。

    for (let i = 0; i < this.dataTableJSON.length; i++) {

      const dataCopy: DataItem = {
        subform = this.dataTableJSON[i].subform.properties.title,
        section = this.dataTableJSON[i].section.properties.title,
        field   = this.dataTableJSON[i].title
      };

      this.obj.data[i] = dataCopy;
    }

以下是我遇到的错误,为了克服我需要更改的错误

这个

  subform = this.dataTableJSON[i].subform.properties.title,
  section = this.dataTableJSON[i].section.properties.title,
  field   = this.dataTableJSON[i].title

致此

  subform: this.dataTableJSON[i].subform.properties.title,
  section: this.dataTableJSON[i].section.properties.title,
  field: this.dataTableJSON[i].title

正在测试

而且它有效!呸!

谢谢戴!

DAI 更新:

我有一个小错误:

最终的 JSON 需要如下所示

  {
    "data": [
      {
        field: "Social Security number"
        required: true
        section: "Employee Information"
        subform: "Personal Information"
      },
      {
        field: "Country of issuance"
        required: true
        section: "Eligibility Information"
        subform: "Employment Eligibility"
      }
    ]
  }

抱歉,戴...再次感谢

【问题讨论】:

  • 只有在该索引处存在正确类型的对象实例时,才能分配给数组中索引元素的成员。
  • 好的,太好了,告诉我这太棒了...我如何得到我想要的并修复它,拜托!此外,这实际上可能是动态的。这意味着 data[] 之后的所有内容可能不是 section.title、subform.title 或 title。我尝试了 push 但这不会导致除了 {} 为 0 之外的任何内容,即 1:title1、2:title 2 不在 {}
  • 我的评论解释了你的代码有什么问题。如果您需要帮助理解我写的内容,请向我详细说明 - 否则我觉得我的评论确实解释了如何解决它。请不要讽刺。
  • 戴,很抱歉你这么说。我以为你明白,如果你提出建议,你会提供一个我可以为你投票的解决方案
  • 我没有在我的评论中提供完整的答案 - 这更多是在正确方向上的提示或推动。但我现在提供了更全面的答案。

标签: arrays typescript javascript-objects


【解决方案1】:

改变这个:

    for (let i = 0; i < this.dataTableJSON.length; i++) {
      this.obj.data[i].subform = this.dataTableJSON[i].subform.properties.title;
      this.obj.data[i].section = this.dataTableJSON[i].section.properties.title;
      this.obj.data[i].field = this.dataTableJSON[i].title;
    }

到这里:

    // Put these `type` declarations somewhere appropriate in your codebase:

    interface DataItem = {
        subform: string;
        section: string;
        field  : string;  
    };

    type ObjType = {
        data: DataItem[]
    };

    // Change your `obj` member to this:
    private readonly obj: ObjType = {
        data: []
    };

    // And change your for loop to this:
    for (let i = 0; i < this.dataTableJSON.length; i++) {
        
        const dataCopy : DataItem = {
            subform: this.dataTableJSON[i].subform.properties.title,
            section: this.dataTableJSON[i].section.properties.title,
            field  : this.dataTableJSON[i].title;
        };

        this.obj.data[i] = dataCopy;
    }

您也可以这样做(这在语法上更短,但隐藏了类型信息,这可能会使刚接触 TypeScript 和 JavaScript 的人感到困惑,他们可能不明白发生了什么):

    for (let i = 0; i < this.dataTableJSON.length; i++) {
        
        this.obj.data[i] = {
            subform: this.dataTableJSON[i].subform.properties.title,
            section: this.dataTableJSON[i].section.properties.title,
            field  : this.dataTableJSON[i].title;
        };
    }

这在语法上可以简化为:

    for (let i = 0; i < this.dataTableJSON.length; i++) {
        const d = this.dataTableJSON[i];
        this.obj.data[i] = {
            subform: d.subform.properties.title,
            section: d.section.properties.title,
            field  : d.title;
        };
    }

【讨论】:

  • 让我试试看。
猜你喜欢
  • 1970-01-01
  • 2020-02-08
  • 2018-01-20
  • 2019-10-13
  • 2023-04-01
  • 2017-12-05
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多