【问题标题】:I need to find a specific value in an array of arrays. Angular, Typescript我需要在数组数组中找到一个特定值。角,打字稿
【发布时间】:2021-06-06 12:09:01
【问题描述】:

我需要在数组数组中查找一个值,但是当我使用 .find 时它返回 undefined

import { Component, OnInit } from '@angular/core';
import * as XLSX from 'xlsx';
import { ExcelSheetsService } from '../services/excel-sheets.service';


@Component({
  selector: 'app-hojaexcel',
  templateUrl: './hojaexcel.component.html',
  styleUrls: ['./hojaexcel.component.css']
})
export class HojaexcelComponent implements OnInit {

  
  constructor( private excelsheetService: ExcelSheetsService ) { }

  ngOnInit(): void {
  }


  codigo: any = ''; 
  datos: [][] = [];
  

  onFileChange( evt: any  ){

  
    
  const target: DataTransfer = <DataTransfer> (evt.target);

  if(target.files.length !== 1) throw new Error ('No se pueden subir varios archivos a la vez');

  const reader: FileReader = new FileReader();

  reader.onload = ( e: any ) => {
    const bstr: string = e.target.result;

    const wb: XLSX.WorkBook = XLSX.read( bstr, { type: 'binary' } );

    const wsname: string = wb.SheetNames[0];

    const ws: XLSX.WorkSheet = wb.Sheets[wsname];

    this.datos = (XLSX.utils.sheet_to_json(ws, { header: 1 }));
    console.log(this.datos);

    return this.datos;

  }; 

  reader.readAsBinaryString(target.files[0]);

  }

  look(): any{
    
    const found = this.datos.find(element => element == this.codigo );
    console.log(found);
    console.log(this.datos);
    

  }


  


  pasardata(){
    this.excelsheetService.impData( this.datos )
      .subscribe( resp => {
        console.log(resp);
      });

  }



  

}

数组的数组是 datos。这是Html:

<p>Subir Archivo excel</p>
<br>

<input type="file" (change)="onFileChange($event)" multiple="false" />

<br>

<button (click)="pasardata()">
    Subir a base de datos Firebase
</button>

<br>

<div class="col">
    <form (ngSubmit)="look()">

        <input type="text" placeholder="Codigo" name="codigo" [(ngModel)]="codigo"/>


        <button>Enviar</button>

    </form>
</div>

我尝试访问 datos 数组数组,它​​返回一个空数组,我想使用数组数组显示一个表,然后使用 .find() 获取表的特定值。

【问题讨论】:

  • 如果 datos 是一个数组数组,那么您的 this.datos.find(element => element == this.codigo ) 元素将始终是一个数组。但是这个。 codigo 是一个字符串,它永远不会相等。

标签: javascript arrays angular typescript multidimensional-array


【解决方案1】:

假设datos: [][] 是一个嵌套的字符串数组,您可以使用flatMapfind

const found = this.datos
  .flatMap(element => element) // flatten nested array
  .find(element => element === this.codigo);

话虽如此,如果datos 是一个嵌套的对象数组,您不能简单地比较{} === {},您需要与某种属性对象进行比较:

const found = this.datos
  .flatMap(element => element) // flatten nested array
  .find(element => element.someProperty === this.codigo);

没有flatMap的版本:

const found = this.datos
  .reduce((acc, curr) => acc.concat(curr))
  .find(element => element === this.codigo);

希望对您有所帮助!

【讨论】:

  • 我收到此错误:src/app/hojaexcel/hojaexcel.component.ts:56:30 - 错误 TS2550:类型“[][]”上不存在属性“flatMap”。您需要更改目标库吗?尝试将 lib 编译器选项更改为 'es2019' 或更高版本。 56 const found = this.datos.flatMap( element => element ).find(element => element == this.codigo );
  • 它需要特定的目标版本才能允许使用 flatMap。让我制作另一个版本作为选项。
  • 谢谢,我已经修复了错误 TS2550,代码运行,但它仍然返回 undefined 作为结果,并且 datos 作为一个空数组。我明白了:prntscr.com/10g9byv
  • @arnoldogonzalez 不幸的是,有些事情仍然不清楚,无法正确排除故障。在执行find 之前,尚不清楚datos 的样子。你能做console.log(this.datos) in look()`并分享输出吗?
  • 这是输出:prntscr.com/10g9r0j,这里是我执行“datos”和“found”prntscr.com/10g9svz的console.log的地方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2017-12-18
  • 2018-09-23
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多