classifyDemand 函数说明
该函可将数组按字段分类,并将字段或自定义名称作为索引便于查找,分类显示,大大提高了试图的遍历压力。
函数体
/**
* @param arr 需要分类的数组
* @param value -> object | array
* @param key -> string
* @param nickName -> string
* @returns {{}|{}|({}|{})|{}}
*/
function classifyDemand(arr, value, key, nickName = []) {
if (!arr || !value) return {};
let result = {};
let count = 0;
if (value.constructor === Object) {
let keys = Object.keys(value);
let values = Object.values(value);
count++;
return classifyDemand(arr, values[count - 1], keys[count - 1], nickName)
}
if (value.constructor === Array) {
if (!key) {
throw new Error('必要的参数 key 不能为空');
}
let temArr = arr.slice();
for (let i in value) {
if (value.hasOwnProperty(i)) {
result[nickName[i] || value[i]] = temArr.filter(item => item[key] === value[i]);
}
}
}
return result
}
参数说明
arr - 需要格式化的数组
value - 需要进行分类的条件,当传递的是一个对象时必须保持对象内部 结构为 { key: [ val1, val2 ] },其中的 key 作为分类的依据字段,val1、val2 作为分类后的索引。当传递的是一个数组时,eg:[val1, val2],val1、val2作 为分类后的索引。特别地,当传递数组类型时,key 参数不能为空。
key - 需要进行分类的依据(字段)。
nickName - 可以自定义索引名称,但必须与value中的元素一一对应,无论是顺序还是数量。
example
let data = [
{ sex: '男', age: 18 },
{ sex: '男', age: 16 },
{ sex: '女', age: 18 },
{ sex: '未知', age: 19 }
];
console.log(classifyDemand(data, { sex: ['男', '女'] }));
// 输出
// {
// '男': [ { sex: '男', age: 18 }, { sex: '男', age: 16 } ],
// '女': [ { sex: '女', age: 18 } ]
// }
console.log(classifyDemand(data, { sex: ['男', '女'] }, 'sex', ['o', 'x']));
// 输出
// {
// o: [ { sex: '男', age: 18 }, { sex: '男', age: 16 } ],
// x: [ { sex: '女', age: 18 } ]
// }
console.log(classifyDemand(data, [18], 'age'));
// 输出
// { '18': [ { sex: '男', age: 18 }, { sex: '女', age: 18 } ] }
console.log(classifyDemand(data, [18, 16], 'age', ['18岁的年轻人', '豆蔻']));
// 输出
// {
// '18岁的年轻人': [ { sex: '男', age: 18 }, { sex: '女', age: 18 } ],
// '豆蔻': [ { sex: '男', age: 16 } ]
// }