js 将数据按需分类

35 篇文章 0 订阅
27 篇文章 0 订阅

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 } ]
// }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值