todoxuhaoList(list, faterItem) { list.sort(this.sortId); if (list) { for (const key of Object.keys(list)) { let item = list[key] if (item.departName == "省本级") { faterItem.children = [...item.children, ...faterItem.children]; let index = faterItem.children.findIndex( item => item.departName == "省本级" ); if (index !== -1) { faterItem.children.splice(index, 1); } } if (item.departName == "市本级") { console.log(item,faterItem) faterItem.children = [...item.children, ...faterItem.children]; let index = faterItem.children.findIndex( item => item.departName == "市本级" ); if (index !== -1) { faterItem.children.splice(index, 1); } } if (item.children) { this.todoxuhaoList(item.children, item); } } } },
时间: 2023-05-18 15:06:43 浏览: 78
这是一个 JavaScript 函数,用于对一个列表进行排序和处理。它接受两个参数,一个是待排序的列表,另一个是父级元素。函数首先对列表进行排序,然后遍历列表中的每个元素,如果该元素的 departName 属性为 "省本级" 或 "市本级",则将该元素的 children 属性合并到父级元素的 children 属性中,并删除原来的 "省本级" 或 "市本级" 元素。最后,如果该元素还有 children 属性,则递归调用该函数处理子元素。
相关问题
优化这段代码stationCode = excelData.getStationNo(); if ("".equals(stationCode)) { errSet.add(ERR_STATION_CODE_NULL); } else if (relId!=null){ // 存入的excel表单中同一个产线下有重复的工位 stationCodes = stationCheckMap.get(relId); // sortId添加 WorkShopLineSortIdPojo maxSortIdPojo = sortIdList.stream().filter(item -> item.getRelId().equals(postStation.getRelId())).findFirst().orElse(null); maxSortId = null; if (maxSortIdPojo!=null){ maxSortId = maxSortIdPojo.getMaxSortId(); } if (stationCodes!=null){ // 重复列表中有此产线下的工位,但此产线下无工位,顺位添加 if (maxSortId == null){ postStation.setSortId(stationCodes.size()); }else { // 重复列表中有此产线下的工位,但此产线下有工位,顺位添加 postStation.setSortId(maxSortId+stationCodes.size()+1); } f = stationCodes.stream().anyMatch(item -> item.equals(excelData.getStationNo())); if (f){ // excel表中重复工位号的产线相同 errSet.add(ERR_STATION_CODE_REPEAT); } } else { // 重复列表无此产线下的工位,且此产线下无工位 if (maxSortId == null){ postStation.setSortId(0); }else { // 重复列表无此产线下的工位,但此产线下有工位 postStation.setSortId(maxSortId+1); } }
这段代码的性能问题可能不在于循环方式,而是在于其中的一些操作。以下是几个可能需要优化的地方:
1. 在每次循环迭代中,都需要进行一次字符串比较,如果excelData.getStationNo()返回的字符串非常长,这会对性能产生影响。可以考虑将"".equals(stationCode)优化为stationCode.isEmpty(),这样可以避免创建一个空字符串对象。
2. 在使用stream进行过滤查找maxSortIdPojo时,可以考虑使用for循环代替,因为stream的创建和操作都会产生一定的开销。另外,如果sortIdList是有序的,可以使用二分查找算法来加速查找。
3. 在使用stream进行工位号比较时,可以考虑使用List.contains()方法代替anyMatch()方法,因为contains()方法的性能更高。
4. 在每次循环迭代中,都需要多次访问postStation对象的属性,这也会对性能产生影响。可以考虑将这些属性缓存在局部变量中,以减少访问次数。
5. 在多个if-else语句中,有些条件是可以合并的,以减少分支判断的次数。
优化后的代码可能如下所示(仅供参考):
```
stationCode = excelData.getStationNo();
if (stationCode.isEmpty()) {
errSet.add(ERR_STATION_CODE_NULL);
return;
}
if (relId != null) {
// 存入的excel表单中同一个产线下有重复的工位
stationCodes = stationCheckMap.get(relId);
maxSortId = null;
for (WorkShopLineSortIdPojo item : sortIdList) {
if (item.getRelId().equals(postStation.getRelId())) {
maxSortId = item.getMaxSortId();
break;
}
}
int size = stationCodes != null ? stationCodes.size() : 0;
if (size > 0 && stationCodes.contains(stationCode)) {
// excel表中重复工位号的产线相同
errSet.add(ERR_STATION_CODE_REPEAT);
return;
}
if (maxSortId == null) {
postStation.setSortId(size);
} else {
postStation.setSortId(maxSortId + size + 1);
}
} else {
// 重复列表无此产线下的工位,且此产线下无工位
postStation.setSortId(0);
}
// 处理其他属性
```
注意,这只是一种可能的优化方案,具体的实现和效果需要根据具体情况进行评估和调整。
int s = tbModulePermissionsService.updateCustom("INSERT INTO tb_module_permissions (" + "create_time,module_id,phone,p_id," + "sort_id,status,update_opr,update_time," + "is_person) " + "(SELECT " + "#{p[0]},#{p[1]},phone,1," + "#{p[2]},#{p[3]},phone,#{p[4]}," + "#{p[5]} from tb_user_info where isDelete = 0 and instr(#{p[6]}, level) > 0 and instr(#{p[7]}, channel_id) > 0)", new Object[]{ tbModuleInfo.getCreateTime(), tbModuleInfo.getModuleId(), tbModuleInfo.getSortId(), tbModuleInfo.getModuleStatus(),tbModuleInfo.getCreateTime(), tbModuleInfo.getIsPerson(), tbModuleInfo.getLe(),tbModuleInfo.getChannel() });不要updateCustom方法,要用list方法,怎么优化
如果要将上述代码优化为使用`list`方法而不使用`updateCustom`方法,可以考虑使用MyBatis的批量插入功能来实现。
首先,在Mapper接口中定义一个插入方法,如下所示:
```java
void insertModulePermissionsList(List<TbModulePermissions> permissionsList);
```
然后,在Mapper文件中编写插入语句,如下所示:
```xml
<insert id="insertModulePermissionsList" parameterType="java.util.List">
INSERT INTO tb_module_permissions (
create_time, module_id, phone, p_id,
sort_id, status, update_opr, update_time,
is_person
)
SELECT
#{createTime}, #{moduleId}, phone, 1,
#{sortId}, #{moduleStatus}, phone, #{createTime},
#{isPerson}
FROM tb_user_info
WHERE isDelete = 0
AND instr(#{le}, level) > 0
AND instr(#{channel}, channel_id) > 0
</insert>
```
接下来,在Service层调用插入方法,如下所示:
```java
List<TbModulePermissions> permissionsList = new ArrayList<>();
TbModulePermissions permissions = new TbModulePermissions();
permissions.setCreateTime(tbModuleInfo.getCreateTime());
permissions.setModuleId(tbModuleInfo.getModuleId());
permissions.setPhone("phone");
permissions.setPId(1);
permissions.setSortId(tbModuleInfo.getSortId());
permissions.setStatus(tbModuleInfo.getModuleStatus());
permissions.setUpdateOpr("phone");
permissions.setUpdateTime(tbModuleInfo.getCreateTime());
permissions.setIsPerson(tbModuleInfo.getIsPerson());
permissionsList.add(permissions);
tbModulePermissionsService.insertModulePermissionsList(permissionsList);
```
通过使用批量插入的方式,将需要插入的数据封装到一个`List`中,并调用插入方法来一次性插入多条数据。这样可以减少与数据库的交互次数,提高插入效率。
请注意,在使用批量插入时,需要根据具体的业务需求来确定如何构建`TbModulePermissions`对象的集合,并将其传递给插入方法。
阅读全文