Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.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 - Fatal编程技术网

Javascript 具有可用或不具有筛选器的对象的筛选器数组

Javascript 具有可用或不具有筛选器的对象的筛选器数组,javascript,arrays,Javascript,Arrays,假设我有这个数据集: const data=[ {动物:猫,名字:穆,年份:2016}, {动物:“猫”,名字:“无印良品”,年份:2021}, {动物:'猫',名字:'我的',年份:2021}, {动物:'dog',名字:'fido',年份:2000}, {动物:'仓鼠',名称:'格里',年份:2020}, {动物:霸王龙,名称:恐龙,年份:2020}, {动物:羊,名称:s,年份:2019}, {动物:绵羊,名称:sss,年份:2016}, ] 我想用一些值来过滤它,比如用动物和年份。很简

假设我有这个数据集:

const data=[
{动物:猫,名字:穆,年份:2016},
{动物:“猫”,名字:“无印良品”,年份:2021},
{动物:'猫',名字:'我的',年份:2021},
{动物:'dog',名字:'fido',年份:2000},
{动物:'仓鼠',名称:'格里',年份:2020},
{动物:霸王龙,名称:恐龙,年份:2020},
{动物:羊,名称:s,年份:2019},
{动物:绵羊,名称:sss,年份:2016},
]
我想用一些值来过滤它,比如用
动物
年份
。很简单,我可以做到:

const animal='sheep'
施工年份=2019年
常量filteredData=data.filter(d=>d.animal===animal&&d.year==year)
//结果
常量过滤器数据=[
{动物:羊,名称:s,年份:2019},
]
这里也一样:

const animal='cat'
施工年份=2021年
常量过滤器数据=[
{动物:“猫”,名字:“无印良品”,年份:2021},
{动物:'猫',名字:'我的',年份:2021},
]
我的问题是,有时
animal
year
可以
null
。在这种情况下,我不想按该值过滤。例如,我希望获得以下信息:

const animal='cat'
const year=null
常量过滤器数据=[
{动物:猫,名字:穆,年份:2016},
{动物:“猫”,名字:“无印良品”,年份:2021},
{动物:'猫',名字:'我的',年份:2021},
]
// ---
常数=空
施工年份=2020年
常量过滤器数据=[
{动物:'仓鼠',名称:'格里',年份:2020},
{动物:霸王龙,名称:恐龙,年份:2020},
]
// ---
常数=空
const year=null
常量过滤器数据=[
{动物:猫,名字:穆,年份:2016},
{动物:“猫”,名字:“无印良品”,年份:2021},
{动物:'猫',名字:'我的',年份:2021},
{动物:'dog',名字:'fido',年份:2000},
{动物:'仓鼠',名称:'格里',年份:2020},
{动物:霸王龙,名称:恐龙,年份:2020},
{动物:羊,名称:s,年份:2019},
{动物:绵羊,名称:sss,年份:2016},
]
我该怎么做

注意,这只是一个简单的例子,在我的例子中,我可以有两个以上的变量作为过滤器。

您可以使用和使用过滤器作为过滤器

d.animal === (animal ?? d.animal)
const数据=[
{动物:“猫”,名称:“亩”,年份:2016},
{动物:“猫”,名字:“无印良品”,年份:2021},
{动物:“猫”,名字:“我的”,年份:2021},
{动物:“狗”,名字:“菲多”,年份:2000},
{动物:“仓鼠”,名称:“gerry”,年份:2020},
{动物:“霸王龙”,名称:“恐龙”,年份:2020},
{动物:“羊”,名称:“s”,年份:2019},
{动物:“绵羊”,名称:“sss”,年份:2016},
];
const-animal=null;
const year=null;
常量filteredData=data.filter(
(d) =>d.animal==(动物??d.animal)和d.year==(年??d.year)
);
console.log(filteredData)正如您所写的“我可以有两个以上的变量作为过滤器…”,我认为硬编码过滤器表达式不是一个好主意。此外,如果您的数据和过滤器都是动态的(如果属性事先不知道),那么这甚至是不可能的。相反,您可以使用以下方法:

const数据=[
{动物:猫,名字:穆,年份:2016},
{动物:“猫”,名字:“无印良品”,年份:2021},
{动物:'猫',名字:'我的',年份:2021},
{动物:'dog',名字:'fido',年份:2000},
{动物:'仓鼠',名称:'格里',年份:2020},
{动物:霸王龙,名称:恐龙,年份:2020},
{动物:羊,名称:s,年份:2019},
{动物:绵羊,名称:sss,年份:2016}
];
const query={animal:'cat',year:null};
//删除所有空值
// https://stackoverflow.com/a/38340730
const q=Object.fromEntries(Object.entries(query.filter)([\uv])=>v!=null));
// https://stackoverflow.com/a/61676007
常量IsubSet=(超级对象,子对象)=>{
返回Object.keys(subObj).every(ele=>{
if(typeof subObj[ele]=“object”)返回isSubset(superObj[ele],subObj[ele]);
返回subObj[ele]==superObj[ele];
});
};
常量filteredData=data.filter(d=>isSubset(d,q));

console.log(filteredData)这将是我第一次尝试解决这个问题(请参见代码中的注释):

const data=[{动物:'cat',名称:'mu',年份:2016},{动物:'cat',名称:'muji',年份:2021},{动物:'cat',名称:'mine',年份:2021},{动物:'fido',年份:2000},{动物:'仓鼠',名称:'gery',年份:2020},{动物:'t-rex',名称:'dino',年份:2020},{动物:'sheep',名称:'s',2019年},{动物:绵羊,名称:sss,年份:2016}];
//使用筛选器对象,而不是使用筛选器文字:
const filter={animal:'dog',year:null};
//然后,对于筛选,编写自己的筛选函数:
常数filterAnimals=(arr,filters)=>arr
.filter(animal=>Object.entries(filters)
.filter(([key,value])=>value!==null)//删除等于null的筛选器属性
.every(([key,value])=>animal[key]==value));

console.log(filterAnimals(data,filter));
简单的解决方案是只检查它:
data.filter(d=>animal!=null?d.animal==animal:true&&year!=null?d.year==year:true)
或者不使用三元表达式,只需添加or语句
(!year | d.year==year)
最好使用
空合并运算符