Javascript 考虑到筛选选项是可选的,筛选数组

Javascript 考虑到筛选选项是可选的,筛选数组,javascript,Javascript,我有一个代码,可以根据某些条件过滤数组。一次可能是1个条件或2个条件,具体取决于插入的用户数量 const arr=[ { 姓名:'约翰', 年龄:44,, 老:“不” }, { 姓名:'约翰', 年龄:4岁, 老:“不” }, { 姓名:'比尔', 年龄:47岁, 老:“不” }, ] 常量filteredata=[4,“John”,“No”]; var find=arr.filter(函数(结果){ 返回filteredData.includes(result.name)和&filtere

我有一个代码,可以根据某些条件过滤数组。一次可能是1个条件或2个条件,具体取决于插入的用户数量

const arr=[
{
姓名:'约翰',
年龄:44,,
老:“不”
},
{
姓名:'约翰',
年龄:4岁,
老:“不”
},
{
姓名:'比尔',
年龄:47岁,
老:“不”
},
]
常量filteredata=[4,“John”,“No”];
var find=arr.filter(函数(结果){
返回filteredData.includes(result.name)和&filteredData.includes(result.age)和&filteredData.includes(result.old);
})
console.log(find)
这个怎么办

使用对象作为过滤器更清楚地表达您想要过滤的内容。如果您只传递
名称:“John”

const arr=[
{
姓名:'约翰',
年龄:44,,
老:“不”
},
{
姓名:'约翰',
年龄:4岁,
老:“不”
},
{
姓名:"比尔",,
年龄:47岁,
老:“不”
},
]
常量filteredData={names:[“John”]};
var find=arr.filter(函数(结果){
返回(!filteredData.names | | filteredData.names.includes(result.name))
&&(!Filteredata.ages | | Filteredata.ages.includes(result.age))
&&(!filteredData.olds | | filteredData.olds.includes(result.old));
})
console.log(find)
也许我能帮你

const arr = [
  {
    name:'John',
    age:44,
    old:'No'
  },
   {
    name:'John',
    age:4,
    old:'No'
  },
  {
    name:'Bill',
    age:47,
    old:'No'
  },
]
const filteredData = ["John"];

const newArr = arr.filter((it) => !filteredData.indexOf(it.name))

display.log(JSON.stringify(newArr))

现在您可以看到这个对象,它由名称John组成。

您需要将
过滤器数据
作为一个对象,以便知道要检查的字段。 请尝试以下代码并运行代码段以查看测试用例:

const arr=[
{
姓名:'约翰',
年龄:44,,
老:“不”
},
{
姓名:'约翰',
年龄:4岁,
老:“不”
},
{
姓名:"比尔",,
年龄:47岁,
老:“不”
},
]
//将此作为对象
让filteredData={
姓名:'约翰',
年龄:4岁,
老:“不”
};
var find=arr.filter(函数(结果){
//从Filteredata获取所有密钥
常量filteredDataKeys=Object.keys(filteredData)
//检查所有钥匙是否通过
返回Filteredatakeys.every(key=>Filteredata[key]==result[key])
})
console.log(查找)
过滤器数据={
姓名:'约翰',
};
find=arr.filter(函数(结果){
//从Filteredata获取所有密钥
常量filteredDataKeys=Object.keys(filteredData)
//检查所有钥匙是否通过
返回Filteredatakeys.every(key=>Filteredata[key]==result[key])
})

console.log(find)
您总是使用
Filteredata.includes(result.name)&&Filteredata.includes(result.age)&&Filteredata.includes(result.old)
,查找相同的三个数据,您期望得到什么?@SMAKSS,如何更改代码以使条件数可选?请您解释以下语句:
return(!Filteredata.names | | Filteredata.names.includes(result.name))&(!Filteredata.ages | | Filteredata.ages.includes(result.age))&(!Filteredata.olds | Filteredata.olds.includes(result.old))
!Filteredata.names | Filteredata.names.includes(result.name)
,我的理解,这里我们检查!Filteredata.names存在,但它如何与
运算符一起工作?在
之后| | Filteredata.names.includes(result.name)
读取条件很容易,从左到右读取,有3个条件和,每个条件都是2个条件的OR。如果filteredData.xxx不存在,则每个OR指定必须返回true(如果第一条语句返回true,则第二条语句不详细说明)或者如果它存在并且包含结果,则必须返回true。xxx@AskMen执行此操作时,会发生以下情况:如果!filteredData.names不存在(NOT操作将返回
true
),因为它是OR操作,第二部分(
include
)将不会执行,因为它不是必需的。如果该数组存在(第一部分是
false
),将对第二部分进行评估。这是一种不使用
if
staments而应用条件的更简单方法。另一种思考方式是:不是“a”或“B”在逻辑上等同于“a”然后是“B”。因此,只有在发生a时才对B进行评估(在本例中,a将是“Filteredata.names exists”)。请看一看,谢谢: