You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:45:07