forEach在Javascript类方法中没有定义



我的代码有问题。在多次尝试寻找解决方案后,我决定从stackoverflow社区获得帮助

我已经创建了一个Javascript类获取注册成员列表。这个成员寄存器被本地化到一个Json文件中,系统可以访问。

我试图通过forEach使用数组数据过滤器。但是方法名为:"Of(ChurchName)"不要将任何foreach方法读入其中。当我使用into Of()时,返回undefined

最初,我在方法"createMemberList()"中使用'return'响应,负责创建完整的数组。这个方法工作正常。但是,在ForEach方法的变量中使用'return'不起作用。然后,由于这个明显的错误,我使用了'this'操作符而不是'return'。但即便如此,正如您在代码中看到的那样,我也不能在"createMemberList()"中使用forEach方法。有人知道吗?

细节:我已经使用了该网站的提示:https://www.techiedelight.com/copy-elements-array-into-another-array-javascript/

const $INIT = {
GetMembers: class{
#listaOrdenadaItens;
#listaMembros;
#MemberListOfChurch;
membersList;
#linkGFile="LinkToJsonFileHere";
/*Returns:
{
"range": "Membros!B5:AB234",
"majorDimension": "ROWS",
"values": [

[ "",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""]
]
}
*/
constructor(ListFromGD){
if(typeof ListFromGD!=="undefined"&&ListFromGD!==null){
this.#linkGFile=ListFromGD;
}
this.#createMemberList();
}
/*Members List*/
Of(ChurchName){
/**Filters member data according congregation
* Usage: new $INIT.GetMembers().Of("ChurchName")
*/
this.#MemberListOfChurch=[];;
this.ChurchName=ChurchName;

this.membersList.forEach((item, count) => {
console.log("Why this code don't appears in console?");
if (/^[a-zA-Z_À-Úà-ús]{2,50}$/.test(ChurchName)==true && ChurchName.toLocaleLowerCase() == item.congregacao.toLocaleLowerCase()) {

this.#MemberListOfChurch[count] = item;
}else{
console.log("Trys to check anyone error");
}

}); 

return this.#MemberListOfChurch;
}
#getListaOrdenada (){
return [
/**Personal Informations */
"Nome Completo",
"Sexo",
"CPF",
"Data de Nascimento",
"RG",
"Orgão Emissor",
"UF_RG",
"Data de Expedição",
"Estado Civil",
"CONJUGE",
"Naturalidade",
"UF_NAT",
"NOME_PAI",
"NOME_MAE",

/**Schooling and ecclesiastical data */
"GRAU_INSTRUCAO",
"PROFISSAO",
"FUNCAO_ECLESIASTICA",
"LOCAL",
"UF_BATISMO",

/**Address informations */
"Endereco",
"cep",
"bairro",
"cidade",
"uf",
"congregacao",
"contact_number",
"whatsapp_number"

]
}
#createMemberList(){
var listaOrdenada = this.#getListaOrdenada();

/**Create an array */
var NewListMember = [];

var DadosMembros={};
/**
* Gets registered members list at system!
*/
this.#getJSON(this.#linkGFile).then(response=>{
response.values.forEach((item, i)=>{
/**Examina membro por membro aqui */
if(item[0]===undefined)return;
/**Creates a name for array of values: Ex: {"Complete Name" : "Leonardo Lima de Sousa"} */
listaOrdenada.forEach((ItemName,N)=>{
if(ItemName===undefined) return;
DadosMembros[ItemName]=item[N];
});


NewListMember[i] = DadosMembros;
DadosMembros={};
});
})

this.membersList=NewListMember;
}

#getJSON=async t=>{const r=await fetch(t);if(!r.ok)throw new Error(r.statusText);return r.json()};


}
}

如果我直接在Chrome控制台运行这个函数的代码,它是有效的。但是在这个类方法中,返回undefined

const newArr = [...arr1, ...arr2]将把arr1和arr2中的所有元素复制到newArr中。你不需要使用foreach

临时解决方案

暂时解决此问题的方法是将CreateMemberList()内容复制到Of()Method。之后,有必要创建一个名为NewListMember[]的新数组,并通过对象将会众数据应用到其中,会众名称等于ChurchName参数

Of()方法将保持如下:

Of(ChurchName){
/**Filters member data according congregation
* Usage: new $INIT.GetMembers().Of("ChurchName")
*/

var 
listaOrdenada   =   this.#getListaOrdenada(),
NewListMember   =   [], 
newArray        =   [],
DadosMembros    =   {};
/**
* Gets all registered members data by Json array.
*/
this.#getJSON(this.#linkGFile).then(response=>{
//Creates a counter variable
var newI=0;

response.values.forEach((item, i)=>{
/**examines member by member here */
if(item[0]===undefined)return;

/**Creates a property name for this array value: }
*Ex: {"Nome completo" : "Leonardo Lima de Sousa"} 
*     "Complete Name"
*/
listaOrdenada.forEach((ItemName,N)=>{
if(ItemName===undefined) return;
DadosMembros[ItemName]=item[N];
});
//Gets current congregation name and set all letters to lowerCase()
var ThisCongregation        = DadosMembros.congregacao;ThisCongregation=ThisCongregation.toLowerCase();

//Gets congregation name in to param: ChurchName and set all letters to lowerCase()
var CongregationIndicate    = ChurchName.toLowerCase();
//Gets Congregation where Congregation name is equal Param ChurchName
////Then, creates a new size for array NewListMember with newI counter
if(ThisCongregation!==undefined&&ThisCongregation!==CongregationIndicate)return;
NewListMember[newI] = DadosMembros;
++newI;
DadosMembros={};
});
});
return NewListMember
}

最终解决方案

哪里有问题?解决方案是什么?#createMemberList()生成一个超过220行的数组。然后,需要等待一段时间,让Of()方法处理所有内容。为此,必须在方法中使用setTimeout()函数,如下所示:

setTimeout(()=>{
console.log(JSON.stringify(this.membersList))
},3000)

代码将保持如下:

const $INIT = {
GetMembers: class{
#listaOrdenadaItens;
#listaMembros;
#MemberListOfChurch;
membersList;
#linkGFile="https://cdn.jsdelivr.net/gh/OficialLeonardoLima/cdn@main/json_test.json";

constructor(ListFromGD){
if(typeof ListFromGD!=="undefined"&&ListFromGD!==null){
this.#linkGFile=ListFromGD;
}
this.#createMemberList();
setTimeout(()=>{
console.log(JSON.stringify(this.membersList))
},3000)

document.querySelector("#console").text=JSON.stringify(this.membersList)
}
/*Members List*/
Of(ChurchName){
/**Filters member data according congregation
* Usage: new $INIT.GetMembers().Of("ChurchName")
*/
this.#MemberListOfChurch=[];;
this.ChurchName=ChurchName;

setTimeout(()=>{   
this.membersList.forEach((item, count) => {
console.log("Why this code don't appears in console?");
if (/^[a-zA-Z_À-Úà-ús]{2,50}$/.test(ChurchName)==true && ChurchName.toLocaleLowerCase() == item.congregacao.toLocaleLowerCase()) {

this.#MemberListOfChurch[count] = item;
}else{
console.log("Trys to check anyone error");
}

}); 
},3000);

return this.#MemberListOfChurch;
}
#getListaOrdenada (){
return [
/**Personal Informations */
"Nome Completo",
"Sexo",
"CPF",
"Data de Nascimento",
"RG",
"Orgão Emissor",
"UF_RG",
"Data de Expedição",
"Estado Civil",
"CONJUGE",
"Naturalidade",
"UF_NAT",
"NOME_PAI",
"NOME_MAE",

/**Schooling and ecclesiastical data */
"GRAU_INSTRUCAO",
"PROFISSAO",
"FUNCAO_ECLESIASTICA",
"LOCAL",
"UF_BATISMO",

/**Address informations */
"Endereco",
"cep",
"bairro",
"cidade",
"uf",
"congregacao",
"contact_number",
"whatsapp_number"

]
}
#createMemberList(){
var listaOrdenada = this.#getListaOrdenada();

/**Create an array */
var NewListMember = [];

var DadosMembros={};
/**
* Gets registered members list at system!
*/
this.#getJSON(this.#linkGFile).then(response=>{
response.values.forEach((item, i)=>{
/**Examina membro por membro aqui */
if(item[0]===undefined)return;

/**Creates a name for array of values: Ex: {"Complete Name" : "Leonardo Lima de Sousa"} */
listaOrdenada.forEach((ItemName,N)=>{
if(ItemName===undefined) return;
DadosMembros[ItemName]=item[N];
});


NewListMember[i] = DadosMembros;
DadosMembros={};
});
})

this.membersList=NewListMember;
}

#getJSON=async t=>{const r=await fetch(t);if(!r.ok)throw new Error(r.statusText);return r.json()};


}
}