如何迭代对象数组或将对象列表转换为数组?

Posted

技术标签:

【中文标题】如何迭代对象数组或将对象列表转换为数组?【英文标题】:How to iterate an array of objects or convert the list of objects to array? 【发布时间】:2020-04-11 06:57:41 【问题描述】:

当我从 SqlServer 调用 API 时,我有以下结构:


  "recordsets": [
    [
      
        "id_alquiler": 71735,
        "nombre_tipo_exhibidor": "Exhibidores de Temporada",
        "nombre_empresa": "TIOMAE",
        "nombre_estado_alquiler": "Por Montar",
        "marca": "ElTio",
        "nombre_sucursal": "EUAI"
      ,
      
        "id_alquiler": 71736,
        "nombre_tipo_exhibidor": "Exhibidores de Temporada",
        "nombre_empresa": "TIOELTOE",
        "nombre_estado_alquiler": "Por Montar",
        "marca": "Wuayba",
        "nombre_sucursal": "TOBAIE"
      ,

当我通过资源管理器在我的 .ts 组件中调用 API 时,它会向我发送此错误“尝试区分 '[object Object]'。只允许使用数组和可迭代对象”

我有结构的界面,可以在后面或前面按照我调用对象的顺序正确键入对象,但它仍然给我一个错误,我知道这是因为我需要转换对象,但我已经用 .map () 和 .keys () 以各种方式进行了测试,我不给,请帮忙。这是后端返回查询的函数:

export async function listAlq(req: Request, res: Response) 
    console.time('loop')
    try 
        let response:Alquiler = await pool1.query(
            "Select query");   
        console.log(response);
        res.status(200).json(response);
    
    catch(error)  //Capturando error
       console.error(error, 'Internal server Error', res.status(500));   
    
    console.timeEnd('loop')

Angular 中的服务

@Injectable(
  providedIn: 'root'
)
export class DataService 
  constructor(
    private http: HttpClient
  )  

  getAllAlq() 
    return this.http.get<Alquiler[]>('http://localhost:3000/api/alq');
  

Angular 组件.tsc

export class AlquileresComponent implements OnInit 

  alquiler: Alquiler[] = [];

  constructor(
    private dataService: DataService
  )  

  ngOnInit() 
    this.fetchAlq();
  

  fetchAlq() 
    this.dataService.getAllAlq()
    .subscribe(alquiler => 
      this.alquiler = alquiler;
      console.log(alquiler);
    );
  


和我的 html

<app-alquileres *ngFor="let alq of alquiler.recordsets">
    <div>
        <h5> alq.id_alquiler </h5>
        <h5> alq.marca </h5>
        <h5> alq.nombre_empresa </h5>
        <h5> alq.nombre_estado_alquiler </h5>
        <h5> alq.nombre_sucursal </h5>
    </div>
</app-alquileres>

我目前正在无限运行对象,我无法在 DOM 中绘制对象,请帮助

【问题讨论】:

检查这个???? stackblitz.com/edit/angular-loop-through-arrays 我工作了,非常感谢兄弟 【参考方案1】:

我认为您的对象嵌套的深度比您的 html 预期的要深。 根据你的 sn-p ...


  "recordsets": [
    [
      
        "id_alquiler": 71735,
        "nombre_tipo_exhibidor": "Exhibidores de Temporada",
        "nombre_empresa": "TIOMAE",
        "nombre_estado_alquiler": "Por Montar",
        "marca": "ElTio",
        "nombre_sucursal": "EUAI"
      ,
      
        "id_alquiler": 71736,
        "nombre_tipo_exhibidor": "Exhibidores de Temporada",
        "nombre_empresa": "TIOELTOE",
        "nombre_estado_alquiler": "Por Montar",
        "marca": "Wuayba",
        "nombre_sucursal": "TOBAIE"
      ,

alquiler.recordsets 是一个包含对象的数组。

不确定更改服务或 html 会更容易/更好,但我敢打赌,如果您将当前的 html 更改为以下内容,您应该会看到一些东西。

<app-alquileres *ngFor="let alq of alquiler.recordsets[0]">
    <div>
        <h5> alq.id_alquiler </h5>
        <h5> alq.marca </h5>
        <h5> alq.nombre_empresa </h5>
        <h5> alq.nombre_estado_alquiler </h5>
        <h5> alq.nombre_sucursal </h5>
    </div>
</app-alquileres>

【讨论】:

你是对的,但仍然不清楚如果数据是数组数组,无论如何我认为这里就是这种情况,干得好 Alberto Lerdo ? @Alberto Lerdo 试试这个解决方案,并在 src / app / components / alquiler / alquiler.component.ts (25,32) 中的 vs code ERROR 中向我发送以下错误:错误 TS2339: Property 'recordsets ' 类型' Alquiler [] ' 上不存在,我尝试更改为任何类型的服务,也没有任何 TT 也在组件中向我发送此消息,当将属性添加到 alquiler.recordsets[0] 属性'recordsets' 'Alquiler[]' 类型上不存在【参考方案2】:

根据错误本身,它只是说您正在尝试迭代和对象。这是不允许的。为什么这么说基本上是..根据您的示例数据集,只要您有 recordsets 这是一个数组。在recordsets 本身下,您有另一个数组。(仔细查看开头的[ 方括号)它基本上返回您尝试在模板上迭代的数组对象的类型,这是不允许的。

您可以做的最简单的解决方案是相应地更改模板以匹配recordsets 中的可迭代元素:

<app-alquileres *ngFor="let alq of alquiler.recordsets[0]">
    <div>
        <h5> alq.id_alquiler </h5>
        <h5> alq.marca </h5>
        <h5> alq.nombre_empresa </h5>
        <h5> alq.nombre_estado_alquiler </h5>
        <h5> alq.nombre_sucursal </h5>
    </div>
</app-alquileres>

一旦您在模板中像这样指定alquiler.recordsets[0],它将允许您的*ngFor 迭代每个对象,因为它实际上是一个Object 数组元素,而不是之前的Array 类型的对象。

另一种解决方案是在打字稿控制器上分配它:

export class AlquileresComponent implements OnInit 

  alquiler:any;

  constructor(
    private dataService: DataService
  )  

  ngOnInit() 
    this.fetchAlq();
  

  fetchAlq() 
    this.dataService.getAllAlq()
    .subscribe(alquiler => 
      this.alquiler = alquiler.recordsets[0];
      console.log(alquiler);
    );
  

在您的模板中:

<app-alquileres *ngFor="let alq of alquiler">
    <div>
        <h5> alq.id_alquiler </h5>
        <h5> alq.marca </h5>
        <h5> alq.nombre_empresa </h5>
        <h5> alq.nombre_estado_alquiler </h5>
        <h5> alq.nombre_sucursal </h5>
    </div>
</app-alquileres>

【讨论】:

? ,这是正确的,但您可以使用 map 运算符并只返回第一项仍然与之前的答案相同,但更清楚 ??

以上是关于如何迭代对象数组或将对象列表转换为数组?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将任何可迭代对象转换为数组

将对象数组转换为CSV文本或将其转换为CSV文本

如何将对象列表转换为对象列表数组,每个数组索引都有 2 个计数?

如何将具有元素数组的每个对象的对象列表转换为具有子元素作为属性的对象数组

ES6 扩展运算符

迭代对象数组属性的值