前端开发中请求接口返回数据通常伴随着对数组(对象数组)的处理
let arr1 = [1,3,5,2,4,6];
let arr2 = [
{id:'1',name:'Banana'},
{id:'2',name:'Apple'},
{id:'3',name:'Orange'},
];
- 判断类型是否为数组
Array.isArray(arr);
Object.prototype.toString.apply(arr) === '[object Array]';
- 然后开始遍历数组
for (let i=0; i<arr.length; i++) {}
for (let i=0,len=arr.length; i<len; i++) {}
arr.forEach(item=>{});
for (let item of arr) {}
- map,filter和reduce方法
let mapArr = arr.map((item,index,arr)=>{});
let filterArr = arr.filter(item=>{});
let result= arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]);
数组排序去重等其它需求
- 排序sort
V8源码里,sort方法使用快速排序,当数组长度小于22,使用插入排序
let nums = [1,3,5,2,4,6];
nums.sort((a,b) => a-b);
console.log(nums);
let persons = [{name:'Big Banana',age:18},{name:'Cui Cui',age:24},{name:'Cong Cong',age:20}];
persons.sort((a,b) => a.age-b.age);
console.log(persons);
function quickSort(arr) {
if (!Array.isArray(arr)) return;
if (arr.length <= 1) return arr;
let num = Math.floor(arr.length / 2);
let value = arr.splice(num, 1)[0];
let left = [], right = [];
for (let i=0, len=arr.length; i<len; i++) {
if (arr[i] > value) {
right.push(arr[i]);
} else {
left.push(arr[i]);
}
}
return [...quickSort(left), value, ...quickSort(right)];
}
let arr = [99,5,7,66,25,10,40];
let sortArr = quickSort(arr);
console.log(sortArr);
- 去重
let arr = [1,1,3,2,3,4,5,7,5,1,5];
arr = [...new Set(arr)];
console.log(arr);
function onlyOne(arr){
if (!Array.isArray(arr)) return;
let obj = {};
let result = [];
arr.forEach(item=>{
if(!obj[item.id]){
result.push(item);
obj[item.id] = true;
}
});
return result;
}
let persons = [{id:1,name:'Big Banana'},{id:2,name:'Cui Cui'},{id:1,name:'Cong Cong'}];
let newArr = onlyOne(persons);
console.log(newArr);
function sortArrDuplicate1(arr) {
if (!Array.isArray(arr)) return;
if (arr.length < 2) return arr;
let result = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== result[result.length - 1]) result.push(arr[i]);
}
return result;
}
function sortArrDuplicate2(arr) {
if (!Array.isArray(arr)) return;
if (arr.length < 2) return arr;
let i = 1;
for (let j = i; j < arr.length; j++) {
if (arr[j] !== arr[i-1]) {
arr[i] = arr[j];
i++
}
}
return arr.splice(0,i)
}
*/
- 两个数组找不同
let arr1 = [1,2,3,4,5],
arr2 = [3,4,5,6,7];
let difference = arr1.concat(arr2).filter((v, i, arr) => arr.indexOf(v) === arr.lastIndexOf(v));
console.log(difference);
- 字典对应(类似sql的左连接left join on)
let dictionary = [
{id:1,code:'001',name:'访客'},
{id:2,code:'002',name:'普通会员'},
{id:3,code:'003',name:'星级会员'},
];
let resData = [
{id:1,name:'Big Banana',level:'003'},
{id:2,name:'Cong Cong',level:'001'},
{id:3,name:'Cui CUi',level:'002'},
];
let obj = {};
dictionary.forEach(item => {
obj[item.code] = item.name;
});
resData = resData.map(item=>{
item.level = obj[item.level];
return item;
});
console.log(resData);
- 巧用reduce,用得越多会发现它越强大
let arr = [1,3,5,7,9];
let sum = arr.reduce((sum,cur) => sum+=cur);
console.log(sum);
let arr = ['a','b','i','g','b','a','n','a','n','a'];
let res = arr.reduce((obj,cur) => {
if(cur in obj){
obj[cur]++;
}else{
obj[cur]=1;
}
return obj;
},{});
console.log(res);
let arr = ['a',['b','i','g'],['b','a','n','a','n','a']];
let res = arr.reduce((arr,cur) => arr.concat(cur),[]);
console.log(res);
function groupBy(objectArray, property) {
return objectArray.reduce( (result, cur) =>{
let key = cur[property];
if (!result[key]) result[key] = [];
result[key].push(cur);
return result;
}, {});
}
let resData = [
{id:1,name:'Big Banana',level:'003'},
{id:2,name:'Cong Cong',level:'001'},
{id:3,name:'Cui CUi',level:'002'},
{id:4,name:'Xiao Hu',level:'002'},
{id:5,name:'Ji Lao Jun',level:'003'},
];
let data = groupBy(resData, 'level');
console.log(data);
some() 和 includes()
const arr = [1,2,4,5,7,8,9]
console.log(arr.includes(1))
console.log(arr.some(item=>item===10))
find(),some()和filter()
const arr = ['1','2','3','4','5'];
let isExist = arr.some(item=>item==='1');
console.log(isExist);
let el = arr.find(item=>item==='1');
console.log(el);
let newArr = arr.filter(item=>item==='1');
console.log(newArr );
数组扁平化 flat
let arr1 = ['bb','cc','hh'], arr2 = ['yy',['tt',['oo']]];
let newArray = arr1.concat(arr2).flat(Infinity)
console.log(newArray)