如何动态筛选而不是使用if-else语句



我有一个redux钩子,负责过滤后要传递到设置状态的服务器数据。。但是有一个动态的条件。

// states 
const [drilledData, setDrilledData] = useState([])

当前代码:

const drillDownData = (seriesIndex, dataPointIndex) => {
// here series index could be from 1-80 in that order
// dataPointIndex is a number and item.dataSet is also a number
// Refactor this code to remove if-else statements to something better
if (seriesIndex === 0) {
const filteredData = coscoData.filter((item) => item.dataSet === dataPointIndex)
setDrilledData(filteredData[0].shipments)
} else if (seriesIndex === 1) {
const filteredData = hapagData.filter((item) => item.dataSet === dataPointIndex)
setDrilledData(filteredData[0].shipments)
} else if (seriesIndex === 2) {
const filteredData = maerskData.filter((item) => item.dataSet === dataPointIndex)
setDrilledData(filteredData[0].shipments)
} else if (seriesIndex === 3) {
const filteredData = othersData.filter((item) => item.dataSet === dataPointIndex)
setDrilledData(filteredData[0].shipments)
} else {
setDrilledData([])
}
return null
}

目前,if-else语句非常简单,并且运行良好。但我必须重复这句话80次。因为我必须过滤数据,并针对序列索引和dataPointIndex及其相关的dataSet来有条件地设置它们

类似数据示例

aclData,
admiralLineData,
anlData,
aplData,
arkasData,

它们内部的数据是这样的,但dataSet可以不止一个。所以我使用过滤器来获取与pointIndex匹配的dataSet。

aclData = ['dataSet': 1, 'shipments' : [...{more objects}]]

所以,我想让if-else语句成为动态的,这样我就不必写80次来覆盖所有的数据集。我该怎么做?我不需要你准确地重构所有代码,任何想法或伪代码都会非常有用。

索引号和相关数据集之间的关系是静态的吗?如果是这样的话,你能创建一个记录这些关系的util对象,然后用它来动态调用你试图使用的数据集吗?它不会像一个巨大的if-else(或switch语句(那么笨重,而且可以重复使用。

如果上面建议的模式太难实现,那么调用辅助函数的switch语句至少可以减少代码:

const filterMyData = (pertinentData, dataIndex) => {
const filteredData = pertinentData.filter((item) => item.dataSet === 
dataIndex)
setDrilledData(filteredData[0].shipments)
}

然后

switch (seriesIndex) {
case 0:
filterMyData(coscoData, dataToPointIndex);
break;
case 1:
filterMyData(hapagData, dataToPointIndex);
break;
....
}

最新更新