在if条件-JavaScript中丢弃空值的最佳方法是什么

在if条件-JavaScript中丢弃空值的最佳方法是什么,javascript,arrays,reactjs,object,filter,Javascript,Arrays,Reactjs,Object,Filter,在为我的React.js应用程序编写过滤功能时,我遇到了以下问题: 因为我有三种不同类型的过滤器(日期、校园和城市),所以我必须根据用户填写的过滤器向用户返回一个对象数组(只能是其中的一个、两个或三个)。为了解决这个问题,我提出了以下解决方案: // Example of user input, something how my state variables should look const date = null const campus = "Examp

在为我的React.js应用程序编写过滤功能时,我遇到了以下问题:

因为我有三种不同类型的过滤器(日期、校园和城市),所以我必须根据用户填写的过滤器向用户返回一个对象数组(只能是其中的一个、两个或三个)。为了解决这个问题,我提出了以下解决方案:

    // Example of user input, something how my state variables should look
    const date = null
    const campus = "Example 1"
    const city = "City 1"
    //

    const array = [ { date: "2020-11-23", campus: "Example 1", city: "City 1" }, 
                    { date: "2020-11-24", campus: "Example 2", city: "City 2" }, ]

    const filteredArray = array.filter(e => {

        if (date && campus && city)
            return e.date === date && e.campus === campus && e.city === city;

        if (date && campus)
            return e.date === date && e.campus === campus;

        if (campus && city)
            return e.campus === campus && e.city === city;

        if (date && city)
            return e.date === date && e.city === city;

        if (date)
            return e.date === date;

        if (campus)
            return e.campus === campus;

        if (city) 
            return e.city === city;
    });

那么,有没有其他方法可以在返回过滤对象时丢弃空值,这样我就可以减少代码的大小?

您可以将它们组合成一条语句:

const filteredArray=array.filter(e=>
(!date | | date==e.date)&(!campus | | campus==e.campus)&(!city | | city==e.city)
);
此外,还可以使对象动态检查所有条件,而无需再次重写每个属性:

const条件={
日期:null,//您也可以删除此行
校园:“示例1”,
城市:“城市1”
};
常量数组=[
{日期:2020-11-23,校园:示例1,城市:城市1},
{日期:'2020-11-24',校园:'示例2',城市:'city 2'}
];
const filteredArray=array.filter(e=>Object.entries(conditions).every([key,value])=>!value | e[key]==value));

控制台日志(filteredArray)您可以将它们组合成一条语句:

const filteredArray=array.filter(e=>
(!date | | date==e.date)&(!campus | | campus==e.campus)&(!city | | city==e.city)
);
此外,还可以使对象动态检查所有条件,而无需再次重写每个属性:

const条件={
日期:null,//您也可以删除此行
校园:“示例1”,
城市:“城市1”
};
常量数组=[
{日期:2020-11-23,校园:示例1,城市:城市1},
{日期:'2020-11-24',校园:'示例2',城市:'city 2'}
];
const filteredArray=array.filter(e=>Object.entries(conditions).every([key,value])=>!value | e[key]==value));

控制台日志(filteredArray)更好的方法是单独或串联运行过滤器

比如:

 function filter(array, date, campus, city) {
      let filteredByDate = filterBy(array, date, 'date')
      let filteredByCampus = filterBy(filteredByDate, campus, 'campus')
      let filteredByCity = filterBy(filteredByCampus, city, 'city')
    
      return filteredByCity
    }
然后各个过滤器将如下所示:

function filterBy(array, data, prop) {
  if(!date) return array
  else return array.filter(e => (e[prop] === data))
}

一个更好的方法是单独或串联运行过滤器

比如:

 function filter(array, date, campus, city) {
      let filteredByDate = filterBy(array, date, 'date')
      let filteredByCampus = filterBy(filteredByDate, campus, 'campus')
      let filteredByCity = filterBy(filteredByCampus, city, 'city')
    
      return filteredByCity
    }
然后各个过滤器将如下所示:

function filterBy(array, data, prop) {
  if(!date) return array
  else return array.filter(e => (e[prop] === data))
}
如果您有一些函数编程知识,它也是一个很好的帮助函数库。如果您有一些函数编程知识,它也是一个很好的帮助函数库。