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 14:06:43 浏览: 60
这是一个 JavaScript 函数,用于对一个列表进行排序和处理。它接受两个参数,一个是待排序的列表,另一个是父级元素。函数首先对列表进行排序,然后遍历列表中的每个元素,如果该元素的 departName 属性为 "省本级" 或 "市本级",则将该元素的 children 属性合并到父级元素的 children 属性中,并删除原来的 "省本级" 或 "市本级" 元素。最后,如果该元素还有 children 属性,则递归调用该函数处理子元素。
相关问题
优化这个函数 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); } } } },
这个函数可以进行如下优化:
function todoxuhaoList(list, faterItem) {
list.sort(this.sortId);
for (const item of list) {
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);
}
} else 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.children) {
this.todoxuhaoList(item.children, item);
}
}
}
主要的优化点有:
1. 使用 for...of 循环代替 for...in 循环,避免了遍历对象原型链上的属性的问题。
2. 将 if...else if... 语句合并为一个 if...else if...else... 语句,避免了重复判断。
3. 将 Object.keys(list) 替换为 for...of 循环,避免了创建一个临时数组的开销。
4. 将 item.children 和 faterItem.children 的顺序颠倒,避免了在数组开头插入元素时的性能问题。
5. 将 const key 替换为 const item,避免了在每次循环中访问对象属性的开销。
6. 将 item.departName 的判断条件从字符串相等改为使用 === 进行严格相等判断,避免了类型转换的开销。
7. 将 item.departName 的判断条件从 if...else if... 语句中提取出来,避免了重复判断。
8. 将 let index = faterItem.children.findIndex(...) 的重复代码提取出来,避免了重复计算。
9. 将 if (list) 的判断条件去掉,因为 list 在 for...of 循环中已经被判断过了。
总之,这些优化都是为了提高代码的可读性和性能。
groupingBy +Collectors.collectingAndThen()
groupingBy是Stream API中的一个方法,它用于将元素按照某个属性进行分组。而Collectors.collectingAndThen则是一个收集器,它将一个收集器的结果进行再处理。
在上面的代码中,groupingBy方法接收了三个参数:分类函数(codeType),一个用于保存分组结果的Map容器(LinkedHashMap::new),和一个收集器(Collectors.collectingAndThen)。收集器collectingAndThen又接收了两个参数:第一个参数为要应用于每个组的收集器(Collectors.toList()),第二个参数为对收集器的结果进行处理的函数(s -> s.stream().sorted(Comparator.comparing(e -> e.getInteger("sortId"))).collect(Collectors.toList()))。
换句话说,这段代码的作用是将items中的元素按照codeType进行分组,并将每个分组中的元素按照sortId进行升序排序。