gpt4 book ai didi

Javascript,如何更好地处理导致长分支 if/else 链的多个过滤器选项

转载 作者:行者123 更新时间:2023-12-03 08:11:46 25 4
gpt4 key购买 nike

我正在使用 JavaScript 在 Google 电子表格中搜索项目。我有几个可用的过滤器,问题是对于我添加的每个过滤器,我似乎有指数级更多的 if/else 语句。

假设我可以按名称、类型和日期进行过滤。日期是必需的,但其他两个选项不是。我最终必须为每个独特的组合都有一个 if/else,以确保我匹配正确的输入。如果我想添加更多方法来过滤数据,它会变得更加困惑。

示例:

  var filterReportType = !CheckIfBlank(reportType);
var filterName = !CheckIfBlank(name);

for(var i = 2; i < dataRange.length; i++)
{
if(dataRange[i][0] != "")
{
searchData.entriesSearched ++;
if(CompareEntryDates(new Date(startDate), new Date(endDate), new Date(dataRange[i][0])))
{
if(filterName && filterReportType)
{
if(name == dataRange[i][2] && reportType == dataRange[i][3])
{
var newEntry = FillEntryObject(i, dataRange);
entries.push(newEntry);
searchData.entriesFound ++;
}
}
else if(filterName)
{
if(name == dataRange[i][2])
{
var newEntry = FillEntryObject(i, dataRange);
entries.push(newEntry);
searchData.entriesFound ++;
}
}
else if(filterReportType)
{
if(reportType == dataRange[i][3])
{
var newEntry = FillEntryObject(i, dataRange);
entries.push(newEntry);
searchData.entriesFound ++;
}
}
else
{
var newEntry = FillEntryObject(i, dataRange);
entries.push(newEntry);
searchData.entriesFound ++;
}
}
}
}

这不是一个可维护的模式,如果我需要添加更多可能的输入来过滤,那么这条语句链将变得庞大。

编辑:为什么这不是重复的:我检查了另一个问题,我看到它将如何缩短一个很长的语句,但我不知道它将如何缩短一长串单独的语句。我仍然需要检查不同的组合,并且我相信我最终会得到相同数量的 if/else 语句。

最佳答案

有两个建议:

  1. 使用连续过滤
  2. 使用函数式方法

对于上面的代码,这意味着:

var filterReportType = !CheckIfBlank(reportType);
var filterName = !CheckIfBlank(name);

if (filterName) {
dataRange = dataRange.filter(function (elm) {
return elm[i][2] === name; });
}

if (filterReportType) {
dataRange = dataRange.filter(function (elm) {
return elm[i][3] === reportType; });
}

// Check the index here: is it really starting from
// the third row? If so, you may need to adapt the
// filter methods above.
for(var i = 2; i < dataRange.length; i++)
{
var newEntry = FillEntryObject(i, dataRange);
entries.push(newEntry);
searchData.entriesFound ++;
}

如果您重新设计数据模型和 FillEntryObject 函数,您可以进一步缩小范围:

filters = { "name": name, "recordType": recordType }

for (var key in filters) {
if (!CheckIfBlank(filter[key])) {
dataRange = dataRange.filter(function (elm) {
return elm[key] === filters[key]; });
}
}

var entries = dataRange.map(MakeEntryObject);

为此,dataRange 应使用字段名称作为第二个索引(如果这不是一个选项,您可以将名称映射到数字)和 MakeEntryObject 应该是从 dataRange 行构建条目对象的工厂方法。

关于Javascript,如何更好地处理导致长分支 if/else 链的多个过滤器选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com