一、对数组进行分类:array.groupBy
首先有一个数组
let list = [ { name: "vue", value: "10" }, { name: "react", value: "10" }, { name: "angular", value: "10" }, { name: "vue", value: "20" }, { name: "react", value: "20" }, { name: "angular", value: "20" }, ];
我们需要对数组按类别进行分组统计,变成如下格式,我们该怎么实现?
let res = { vue: [ { name: "vue", value: "10" }, { name: "vue", value: "20" } ], react: [ { name: "react", value: "10" }, { name: "react", value: "20" } ], angular: [ { name: "angular", value: "10" }, { name: "angular", value: "20" } ], };
通常的实现方式是通过循环比较,如下
let resObj = {}; for (let index = 0; index < list.length; index++) { const element = list[index]; resObj[element.name] = resObj[element.name] || []; resObj[element.name].push(element); } // resObj = { // vue: [ { name: "vue", value: "10" }, { name: "vue", value: "20" } ], // react: [ { name: "react", value: "10" }, { name: "react", value: "20" } ], // angular: [ { name: "angular", value: "10" }, { name: "angular", value: "20" } ] // };
但是,这样写很繁琐,这个时候如果使用array.groupBy() 就方便多了
let resObj = list.groupBy(item => item.name); // resObj = { // vue: [ { name: "vue", value: "10" }, { name: "vue", value: "20" } ], // react: [ { name: "react", value: "10" }, { name: "react", value: "20" } ], // angular: [ { name: "angular", value: "10" }, { name: "angular", value: "20" } ] // };
二、更灵活的 Map :array.flatMap()
但有时,我们需要跳过数组中的某些元素,并返回新的数组。通常做法
let arr = [1, 2, 3, 4]; let resArr = arr.filter((x) => x !== 1).map((x) => x * 3); // resArr = [ 6, 9, 12 ];
使用 map 和 filter 结合的方式固然可以解决我们的需求,但多个方法的结合让代码看起来不那么简洁易读。可以使用flatMap 方法更简单的实现。
let arr = [1, 2, 3, 4]; let resArr = arr.flatMap((x) => (x === 1 ? [] : [x * 3])); // resArr = [ 6, 9, 12 ];