如何修改getTeam()函数返回数组而非字符串,实现DataTable多队伍筛选
1. 修正getTeam()函数,返回队伍名称数组
你之前的filter写法逻辑本身没有问题,只是返回结果是匹配的完整队伍对象数组,若要直接拿到队伍名称组成的字符串数组,需要搭配.map()提取Team字段,修正后的代码如下:
var teamData = [{ "Team" : "Team 1", "Players" :[ "Beerus Dev", "Goten Dev", "Trunks Dev", "Majin Bu Dev" ] }, { "Team" : "Team 2", "Players" : [ "Beerus Dev", "Shap Dev", "Krillin Dev" ] }]; var currentUser = "Beerus Dev"; // 接收用户名作为入参,降低变量作用域导致的匹配异常 function getTeam(user) { return teamData // 筛选出所有包含当前用户的队伍对象 .filter(team => team.Players.includes(user)) // 提取队伍名称组成新数组返回 .map(team => team.Team); } var currentTeam = getTeam(currentUser); console.log(currentTeam); // 输出 ["Team 1", "Team 2"]
注意:如果存在大小写、前后空格不一致的匹配需求,可以把筛选条件改成team.Players.some(player => player.trim().toLowerCase() === user.trim().toLowerCase()),避免格式差异导致的匹配失败。
2. 适配DataTable筛选逻辑
因为现在currentTeam是数组类型,不能再用===做相等判断,需要改用Array.includes()判断当前行的队伍是否属于用户所属队伍列表,修改后的筛选代码如下:
$.fn.dataTable.ext.search.push( function(settings, searchData, index, rowData, counter, statusClass) { var userName = searchData[1]; var searchTeam = searchData[0]; var api = $.fn.dataTable.Api('#myTable'); if (settings.sTableId === 'myTable' ) { return userName === thisUserTitle; } if (settings.sTableId === 'certificateTable' ) { // 校验当前行的队伍是否在用户所属队伍数组中 return currentTeam.includes(searchTeam); } return true; } );
如果你之前执行filter得到空数组,大概率是currentUser赋值时机在filter执行之后,或者currentUser和Players数组中的用户名存在格式差异,上述写法可以规避大部分这类问题。
内容的提问来源于stack exchange,提问作者BeerusDev
相关产品推荐
相关产品推荐

