在做单词本的时候,由于后台直接把所有的单词返回给我,所以需要自己将它们按首字母A-Z进行分类且放进新的数组里头。
先看看处理前的数据 :
Share my code...
let WordList = [];//处理后的数组
for(let i=0;i<26;i++){
const key = String.fromCharCode(65+i) //A-Z赋给key当作键
let map = {}
map[key] = {
title: key,
items: []
}
this.data.List.map((v,k)=>{ //遍历单词本
let firstIndex = v.WordName.substr(0, 1);//首字母
if(firstIndex.toUpperCase() == String.fromCharCode(65+i)){//统一转成大写进行逐个判断
map[key].items.push(v.WordName)//push进相对应的数组里头
}
})
//如果当前的数组里头为空,则跳过。
if(map[key].items === undefined || map[key].items.length == 0){
continue;
}else{
WordList.push(map[key])//将分类好的每个对象 合并在一个数组里面
}
}
//给data里头声明的WordList赋值。(这里的情景是小程序)
this.setData({
WordList:WordList
})
这是处理后的数据截图。顺利将单词按A-Z分类~
小结
这种处理方式虽然能实现效果但是在性能方面影响很大。
想一想,for循环嵌套map遍历,如果原来的数组长度很大,那个处理速度一定很慢。
参考下我同事的做法~简单明了。比♥
封装个formatList(arr,keyword)
方法。arr
需要处理的数组名称,keyword
数组里头的字段名。
function formatList(arr,keyword) {
let newArr1 = [];
let tempArr = [];
let reg = /\b(\w)|\s(\w)/g;
let k = 0;
let firstWord = arr[0][keyword].charAt(0).toUpperCase();//获取第一个分类字母
arr.map((v) => {
v[keyword] = v[keyword].replace(reg,m=>m.toUpperCase());//首字母大写
if(firstWord == v[keyword].charAt(0)){
tempArr.push(v);
newArr1[k] = {
Title:firstWord,
List:tempArr
}
}else{
//这里循环到这表示已经第二个字母了
firstWord = v[keyword].charAt(0);//设置第二字母
tempArr = [];//把之前的清除掉
tempArr.push(v);//添加第一个
newArr1[++k] = {//自增
Title: firstWord,
List : tempArr
}
}
});
return newArr1;
}
方法调用
var newList = formatList(list,'WordName');
好了~学习一波先。
喜欢的小伙伴们可以点个赞哦。