如何使用本机javascript制作“groupBy”
如何使用本机javascript实现如何使用本机javascript制作“groupBy”,javascript,collections,ecmascript-6,group-by,lodash,Javascript,Collections,Ecmascript 6,Group By,Lodash,如何使用本机javascript实现groupBy 【分组依据的定义】 创建一个对象,该对象由通过iteratee运行集合的每个元素的结果生成的键组成。分组值的顺序由它们在集合中出现的顺序决定。每个键的对应值是负责生成键的元素数组。使用一个参数(value)调用iteratee 【期望输出】 groupBy([6.1,4.2,6.3],数学地板); // => { '4': [4.2], '6': [6.1, 6.3] } groupBy(['1'、'2'、'3']、'length');
groupBy
【分组依据的定义】
创建一个对象,该对象由通过iteratee运行集合的每个元素的结果生成的键组成。分组值的顺序由它们在集合中出现的顺序决定。每个键的对应值是负责生成键的元素数组。使用一个参数(value)调用iteratee
【期望输出】
groupBy([6.1,4.2,6.3],数学地板);
// => { '4': [4.2], '6': [6.1, 6.3] }
groupBy(['1'、'2'、'3']、'length');
//=>{'3':['1','2'],'5':['3']}
您可以使用对象来收集项目。通过将iteratee应用于项来创建键
iteratee可以是字符串或函数,因此我们需要检查类型,以及是否是从项中提取属性的stringcreate函数
集合可以是数组或对象,我们可以使用来获取数组
constgroupby=(集合,迭代对象=(x)=>x)=>{
const it=typeof iteratee=='function'?
迭代对象:({[iteratee]:prop})=>prop;
常量数组=数组.isArray(集合)?集合:对象.值(集合);
返回数组.reduce((r,e)=>{
常数k=it(e);
r[k]=r[k]| |[];
r[k].推(e);
返回r;
}, {});
};
console.log(groupBy([6.1,4.2,6.3],Math.floor));//=>{ '4': [4.2], '6': [6.1, 6.3] }
log(groupBy(['one','two','three'],'length');//=>{'3':['1','2'],'5':['3']}
log(groupBy({a:6.1,b:4.2,c:6.3},Math.floor));//=>{'4':[4.2],'6':[6.1,6.3]}
您可以使用reduce
并按键函数公开泛型组
function groupBy(arr, groupByKeyFn )
{
return arr.reduce( (acc, c) => {
var key = groupByKeyFn(c);
acc[key] = acc[key] || [];
acc[key].push(c)
return acc;
}, [])
}
现在您可以将此函数用作
var arr1 = [6.1, 4.2, 6.3];
var arr2 = ['one', 'two', 'three'];
console.log( groupBy(arr1, s => Math.floor(s) ) );
console.log( groupBy(arr2, s => s.length ) );
演示
函数groupBy(arr,groupByKeyFn){
返回arr.reduce((acc,c)=>{
var key=groupByKeyFn(c);
acc[键]=acc[键]| |[];
acc[键]。按下(c)
返回acc;
}, {})
}
var arr1=[6.1,4.2,6.3];
var arr2=['1','2','3'];
log(groupBy(arr1,s=>Math.floor);
log(groupBy(arr2,s=>s.length))代码>那么问题出在哪里?@Sirko我想用原生javascript创建groupBy,而不是来自Lodashy,如果不编写准确的代码,我想这最多需要10行代码:一个循环、一个if
和一些赋值。