Javascript 在Angular 6应用程序中,array.find函数不';在数组中找不到现有元素

Javascript 在Angular 6应用程序中,array.find函数不';在数组中找不到现有元素,javascript,arrays,angular,Javascript,Arrays,Angular,我的Angular 6应用程序有一个问题,现在真的找不到答案,所以如果可以,请帮助我。非常感谢。接下来的问题是: 我有一个包含以下内容的数组(userDocuments): [{"DocumentId":1,"DocumentName":"Osobna iskaznica","Mark":"13994000"},{"DocumentId":2,"DocumentName":"Putovnica","Mark":"qprtobm777"}]. 正在从此阵列填充下拉列表。下拉列表旁边是用于编辑对话

我的Angular 6应用程序有一个问题,现在真的找不到答案,所以如果可以,请帮助我。非常感谢。接下来的问题是:

我有一个包含以下内容的数组(userDocuments):

[{"DocumentId":1,"DocumentName":"Osobna iskaznica","Mark":"13994000"},{"DocumentId":2,"DocumentName":"Putovnica","Mark":"qprtobm777"}].
正在从此阵列填充下拉列表。下拉列表旁边是用于编辑对话框中选定元素内容的按钮

<select id="select-document" class="form-control" [(ngModel)]="selectedDocumentId">
    <option *ngFor="let document of userDocuments" [value]="document.DocumentId">
    {{ document.DocumentName }} ({{ document.Mark }})</option>
    </select>
<button class="btn btn-danger btn-40 ml-1" type="button" (click)="openDocumentDailog(true)"> <i class="fa fa-edit"></i></button>
对于变量currentDoc,我得到了在第二次搜索中未定义的错误。如您所见,我正在记录值。以下是结果:

array: [{"DocumentId":1,"DocumentName":"Osobna iskaznica","Mark":"13994000"},{"DocumentId":2,"DocumentName":"Putovnica","Mark":"qprtobm777"}]
文件编号:1

Object { DocumentId: 1, DocumentName: "Osobna iskaznica", Mark: "13994000" }

array: [{"DocumentId":1,"DocumentName":"Osobna iskaznica","Mark":"13994000"},{"DocumentId":2,"DocumentName":"Putovnica","Mark":"qprtobm777"}]
文件编号:2

undefined
在代码中,对我来说一切看起来都是正确的,因为documentId值(1或2)出现在一个数组元素中。我还需要说,当我从下拉列表中选择返回第一个值时,也会收到未定义元素的错误消息。第一次编辑后,由于array.find方法的原因,下一次编辑不再有效

我是遗漏了什么,还是问题更深了?多谢各位


Zeljko

您使用的是严格比较(例如,===),只有在操作数类型相同且内容匹配时才是真的。内容(DocumentId和this.selectedDocumentId)匹配,但操作数的类型不同。尝试使用
=
而不是
==
,它似乎找不到您的文档,因为:

const currentDoc = this.userDocuments.find(x => x.DocumentId == this.selectedDocumentId);

相比之下,我们需要记住,
=
检查值和类型。在json中,id的类型为
number
,但在模板中,您使用的是默认为字符串的
value
。如果要将id保留为
号码
,则需要使用
[ngValue]

<select id="select-document" class="form-control" [(ngModel)]="selectedDocumentId">
  <option *ngFor="let document of userDocuments" [ngValue]="document.DocumentId">
    // ...
  </option>
</select>

// ...

是否已初始化
selectedDocumentId

您可以执行以下操作:

// the dropdown will select the first item by default
    constructor() {
      this.selectedDocumentId = this.userDocuments[1].DocumentId;
    }
第二:

const currentDoc=this.userDocuments.find(x=>x.DocumentId==this.selectedDocumentId)

x.DocumentId
是一个
int
但是
这个。selectedDocumentId
是一个字符串,您可以将
int
字符串
==
进行比较

解决方案:
您可以执行
{“DocumentId”:“1”(字符串),“DocumentName”:“Osobna iskaznica”,“Mark”:“13994000”}


或者做
x.DocumentId==parseInt(this.selectedDocumentId,10)
来解决这个问题。

在头痛了两天之后,在发布案例之后,我发现问题出在…find(x=>x.DocumentId==this.selectedDocumentId),但不确定原因。在typescript中,selectedDocumentId被指定为一个数字(与下拉列表ngModel关联的变量),因此在比较值时,所有内容看起来都是正确的。以防万一,我在这之前加了加号(+)。选择了DocumentId,用于铸造数字和立即查看应用程序。不知道为什么。知道吗?不,我不知道。我现在尝试使用一些selectedDocumentId初始值,但不强制转换为数字仍然不起作用。是的,当数组充满数据时就是这样。如下面的回答所述,我将代码从value改为ngValue,以保持变量为数字,现在一切正常。谢谢。是的,就是这样。我改成了ngValue。谢谢你100倍!:)
// the dropdown will select the first item by default
    constructor() {
      this.selectedDocumentId = this.userDocuments[1].DocumentId;
    }