Javascript 如何根据条件从数组中删除重复元素?
如果存在多条消息且元素Javascript 如何根据条件从数组中删除重复元素?,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,如果存在多条消息且元素结算ESC不包含未覆盖或无效数量,则尝试写入逻辑,反之亦然。我应该能够删除带有notCovered/invalidQuantity字符串的重复项并保留 资料 main.js const validateEntries = (messages) => { let filteredMsg; if (!messages) { return []; } if(messages.length > 1) { console.log("Multiple
结算ESC
不包含未覆盖或无效数量,则尝试写入逻辑,反之亦然。我应该能够删除带有notCovered/invalidQuantity字符串的重复项并保留
资料
main.js
const validateEntries = (messages) => {
let filteredMsg;
if (!messages) {
return [];
}
if(messages.length > 1) {
console.log("Multiple messages");
const response = [];
let bRet = false;
const mulitpleMessages = messages.reduce((acc,curr) => {
if (/not covered|invalid quantity/i.test(curr.settlementDesc !== true) {
bRet = true;
}
if(bRet) {
if( acc.settlementCode == curr.settlementCode) {
return acc;
}
}
return curr;
});
filteredMsg = mulitpleMessages;
} else {
filteredMsg = messages.filter((item) => {
if (/not covered|invalid quantity/i.test(item.settlementDesc)) {
return true;
} else {
return item.settlementDesc.includes(':');
}
});
}
return filteredMsg;
};
console.log(validateEntries(messages));
预期输出
Scneario#1 ouput
[
{
"settlementCode": "359",
"settlementDesc": "Needs prior authorization: System could not process your request. Call us at the toll-free number on your benefit ID card."
}
];
Scenario#2
[
{
"settlementCode": "58",
"settlementDesc": "Not Covered Needs prior authorization: System could not process your request. Call us at the toll-free number on your benefit ID card."
}]
错误
let bRet = false;
38 | const mulitpleMessages = messages.reduce((acc,curr) => {
> 39 | if (/not covered|invalid quantity/i.test(curr.settlementDesc !== true) {
|
41 | bRet = true;
42 | }
这一行缺少一个右括号:
if (/not covered|invalid quantity/i.test(curr.settlementDesc !== true) {
像这样修复它:
const messages = [
{
"settlementCode": "58",
"settlementDesc": "Not Covered Needs prior authorization: System could not process your request. Call us at the toll-free number on your benefit ID card."
},
{
"settlementCode": "58",
"settlementDesc": "Not Covered Needs prior authorization: System could not process your request. Call us at the toll-free number on your benefit ID card."
},
{
"settlementCode": "359",
"settlementDesc": "Needs prior authorization: System could not process your request. Call us at the toll-free number on your benefit ID card."
}
];
const validateEntries = (messages) => {
let filteredMsg;
if (!messages) {
return [];
}
if(messages.length > 1) {
console.log("Multiple messages");
const response = [];
let bRet = false;
const mulitpleMessages = messages.reduce((acc,curr) => {
if (/not covered|invalid quantity/i.test(curr.settlementDesc !== true)) {
bRet = true;
}
if(bRet) {
if( acc.settlementCode == curr.settlementCode) {
return acc;
}
}
return curr;
});
filteredMsg = mulitpleMessages;
} else {
filteredMsg = messages.filter((item) => {
if (/not covered|invalid quantity/i.test(item.settlementDesc)) {
return true;
} else {
return item.settlementDesc.includes(':');
}
});
}
return filteredMsg;
};
console.log(validateEntries(messages));
您的代码运行正常您可以使用嵌套的
过滤器()
const messages=[{“结算代码”:“58”,“结算代码”:“未涵盖的需求事先授权:系统无法处理您的请求。请拨打您的福利ID卡上的免费电话号码与我们联系。”},{“结算代码”:“58”,“结算代码”:“未涵盖的需要事先授权:系统无法处理您的请求。请拨打您福利ID卡上的免费电话号码与我们联系。”},{“结算代码”:“359”,“结算代码”:“需要事先授权:系统无法处理您的请求。请拨打您福利ID卡上的免费电话号码与我们联系。”}];
const res=messages.filter(x=>
messages.filter(a=>a.settlementCode==x.settlementCode)。长度==1
);
console.log(res)
我突然想到,这需要一些更干净、更合理的代码。我正在想象一个类似以下内容的解决方案:
const messages = [
{
"settlementCode": "58",
"settlementDesc": "Not Covered Needs prior authorization: System could not process your request. Call us at the toll-free number on your benefit ID card."
},
{
"settlementCode": "58",
"settlementDesc": "Not Covered Needs prior authorization: System could not process your request. Call us at the toll-free number on your benefit ID card."
},
{
"settlementCode": "359",
"settlementDesc": "Needs prior authorization: System could not process your request. Call us at the toll-free number on your benefit ID card."
}
];
const validateEntries = (messages) => {
let filteredMsg;
if (!messages) {
return [];
}
if(messages.length > 1) {
console.log("Multiple messages");
const response = [];
let bRet = false;
const mulitpleMessages = messages.reduce((acc,curr) => {
if (/not covered|invalid quantity/i.test(curr.settlementDesc !== true)) {
bRet = true;
}
if(bRet) {
if( acc.settlementCode == curr.settlementCode) {
return acc;
}
}
return curr;
});
filteredMsg = mulitpleMessages;
} else {
filteredMsg = messages.filter((item) => {
if (/not covered|invalid quantity/i.test(item.settlementDesc)) {
return true;
} else {
return item.settlementDesc.includes(':');
}
});
}
return filteredMsg;
};
console.log(validateEntries(messages));
const transform=combine(
uniqueBy(sameProp(“结算代码”),
筛选器(非(propMatches('settlementDesc',['not covered','invalid quantity']))
)
所有这些助手函数将做什么
其思想是,combine
将接受两个函数,并返回一个新函数,将一个函数的输出传递到另一个函数。这个函数有一个标准名称,compose
,因此我实际上会选择这个名称
sameProp('foo')
将接受两个对象并判断它们是否具有相等的foo
属性。因此sameProp
将接受属性名称并返回该二进制谓词。(谓词只是一个返回true
或false
的函数)
uniqueBy
将接受一个二进制谓词和一个列表,并基于该谓词删除所有重复项,只保留第一个
filter
将把Array.prototype.filter
提升为一个独立的函数
propMatches
将接受属性名和字符串列表,返回接受对象的函数,并报告该对象的names属性是否与其中一个字符串的正则表达式匹配
最后,not
将简单地接受一个谓词,并返回第二个谓词,如果第一个谓词返回true
,则返回false
,如果返回false
,则返回true
(也可以称之为inverse
,contract
,或complete
)
以下是一个实现:
const compose=(f,g)=>
(x) =>f(g(x))
常量过滤器=(fn)=>(xs)=>
xs.过滤器(fn)
常数不=(f)=>
(x) =>!f(x)
常数sameProp=(prop)=>(a,b)=>
a[prop]==b[prop]
const uniqueBy=(pred)=>(xs)=>
xs.filter((x,i)=>xs.findIndex(y=>pred(x,y))==i)
const propMatches=(prop,vals,re=new RegExp(vals.join(“|”),“i”)=>
(x) =>!!重新测试(x[prop])
常量转换=合成(
uniqueBy(sameProp(“结算代码”),
筛选器(非(propMatches('settlementDesc',['not covered','invalid quantity']))
)
const messages=[{settlementCode:“58”,settlementDesc:“未涵盖的需求事先授权:系统无法处理您的请求。请拨打您的福利ID卡上的免费电话号码与我们联系。”},{settlementCode:“58”,settlementDesc:“未涵盖的需要事先授权:系统无法处理您的请求。请拨打您福利ID卡上的免费电话号码与我们联系。“},{settlementCode:“359”,settlementDesc:“需要事先授权:系统无法处理您的请求。请拨打您福利ID卡上的免费电话号码与我们联系。”}]
控制台日志(
转换(消息)
)< /代码>该项将根据“代码> >结算代码< /代码>或<代码> TestMultEclipse >代码>或两者都需要相同。@ MaHER ALI副本将被考虑在<代码>结算代码< /代码>基于结算代码删除您的对象。它将是安全的。如果存在不包含notCovered/invalidQuantity的元素,则删除所有包含notCovered/invalidQuantity的元素。您的答案可以解决方案2,我们如何调整方案1,在此方案中,所有元素都可以具有相同的属性code@hussain你的例子不足以描述你的问题em.使用添加和两项更新示例,其中一项将保留。