Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Ecmascript 6 - Fatal编程技术网

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.使用添加和两项更新示例,其中一项将保留。