Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从复杂数据中格式化可读字符串_Javascript_Algorithm_Performance_Conditional Statements_Logic - Fatal编程技术网

Javascript 如何从复杂数据中格式化可读字符串

Javascript 如何从复杂数据中格式化可读字符串,javascript,algorithm,performance,conditional-statements,logic,Javascript,Algorithm,Performance,Conditional Statements,Logic,我有一个函数,它接收一个由4个数组组成的对象,第一个数组有一个缺少文件a的客户列表,第二个数组有一个需要更新文件a的客户列表,第三个数组有一个缺少文件B的客户列表,第四个数组有一个需要更新文件B的客户列表 我有一个函数,它接收对象并检查所有4个数组,然后生成这样一封电子邮件“这是一封电子邮件,通知您客户A和B缺少文件-A,客户C和D需要更新文件-A,客户A和B缺少文件-B,客户F和E需要更新文件-B” 我想通过if语句来生成这封电子邮件,但问题是,有16种不同的条件我需要定制一封邮件 我觉得写1

我有一个函数,它接收一个由4个数组组成的对象,第一个数组有一个缺少文件a的客户列表,第二个数组有一个需要更新文件a的客户列表,第三个数组有一个缺少文件B的客户列表,第四个数组有一个需要更新文件B的客户列表

我有一个函数,它接收对象并检查所有4个数组,然后生成这样一封电子邮件“这是一封电子邮件,通知您客户A和B缺少文件-A,客户C和D需要更新文件-A,客户A和B缺少文件-B,客户F和E需要更新文件-B”

我想通过if语句来生成这封电子邮件,但问题是,有16种不同的条件我需要定制一封邮件

我觉得写15条其他语句不是好办法

我列出了下面所有可能的组合,0表示阵列中没有客户,1表示阵列中有客户

我想我的问题是,有人知道更有效的方法吗?一般来说,如何处理可能有16种不同条件的复杂if语句


在您的问题中生成电子邮件只需要一个if,而不是您认为的位置。您的电子邮件将如下所示:

函数生成消息(数据){
//假设数据如下所示:
//类型数据={
//错误:字符串[];
//aUpdate:string[];
//bMissing:string[];
//bUpdate:string[];
// };
函数joinListWithAnd(列表){
如果(列表和列表长度>1){
const last=list.pop();
返回`${list.join(“,”}和${last}`;
}
返回列表&&list.length?列表[0]:空
}
常数件={
Amising:“缺少文件-A”,
更新:“需要更新文件-A”,
bMissing:“缺少文件B”,
更新:“需要更新文件B”,
};
const statusMessages=[];
for(对象项(数据)的常量[键,值]){
push(`customers${joinListWithAnd(data.value)}${pieces[key]}`);
}
return`这是一封电子邮件,通知您${joinListWithAnd(statusMessages)}`
}

log(generateMessage({aMissing:[“A”,“B”]、bmising:[“C”]、bUpdate:[“A”,“B”,“C”]}))
您可以
zip
数组并重新创建对象
fromEntries()
,这样您就可以有效地检查哪些人缺少文件或有需要更新的文件。然后,您可以通过创建句子并将它们连接在一起来形成邮件字符串

//假定对象
常数数据={
错误:[0,1,0,1,0,1],
更新日期:[1,1,0,0,0,1],
bMissing:[0,1,1,1,0,1],
更新日期:[0,1,0,0,0,0]
}
const getFilesPerPerson=(数据)=>{
const values=Object.values(数据);//获取值
常量键=对象键(数据)
//将(zip)数组合并到条目中[personx:[x,x,x,x]]
const mergedValues=值[0]。映射((\ux,i)=>{
返回[
`个人${i+1}`,
values.map((val)=>val[i]).map((v,j)=>v&&keys[j]).filter(x=>x)
];
});
return Object.fromEntries(mergedValue);//从条目创建对象
}
const writeMail=(人)=>{
//造句
const语句=Object.entries(people.map)([k,v])=>{
return`${k}有${v.map((val)=>`${val}')};
});
返回句子。join(“”;//连接到邮件
}
const people=getFilesPerPerson(数据);
const mail=writeMail(人);

控制台日志(邮件)首先,我可能会为每个专栏发送一封单独的电子邮件,或者在电子邮件中列出4个单独的列表。但如果这是不可行的或只是不需要的,也许可以创建一个包含所有客户的集合,在集合中循环并为适用于他们的每一列附加一条消息。我喜欢以数组形式开始我的消息,然后在将数组加入字符串消息时可以使用连词(“and”或“,”)。您尝试过我的答案吗?考虑给出一些反馈。感谢这一点非常完美,只需在for循环中更改“数据值”到“值”。