• JS 根据某个字段进行排序或分组


    JS 数组中根据某个字段进行排序

    const arr = [
      { name: "崔喻琪", age: 32 },
      { name: " 王忱景", age: 18 },
      { name: " 房真睿", age: 27 },
      { name: "姬泉孝", age: 20 },
      { name: "余嘉芳", age: 16 },
      { name: "孙平卉", age: 23 },
    ];
    console.log(this.abilitySort(arr, "age", true));

    1. /** 根据传入的字段进行排序
    2. * @param arr 需要排序的数组
    3. * @param property 排序的字段
    4. * @param desc true.升序 false.降序
    5. * @returns {*} 排好序后的数组
    6. */
    7. abilitySort(arr, property, desc) {
    8. return arr.sort(function (a, b) {
    9. const val1 = a[property];
    10. const val2 = b[property];
    11. if (desc) {
    12. return val1 - val2; // 升序排列
    13. } else {
    14. return val2 - val1; // 降序排列
    15. }
    16. });
    17. },

    JS 数组中根据某个字段进行分组

    const arr = [
      { id: "1001", name: "崔喻琪", age: 32 },
      { id: "1001", name: " 王忱景", age: 18 },
      { id: "1001", name: " 房真睿", age: 27 },
      { id: "1002", name: "姬泉孝", age: 20 },
      { id: "1002", name: "余嘉芳", age: 16 },
      { id: "1003", name: "孙平卉", age: 23 },
    ];
    console.log(this.abilitySort(arr, "id"));

    1. /** 根据传入的字段进行分组
    2. * @param arr 需要分组的数组
    3. * @param property 分组的字段
    4. * @returns {*[]} 已分好组的数组
    5. */
    6. abilitySort(arr, property) {
    7. let map = {};
    8. for (let i = 0; i < arr.length; i++) {
    9. const ai = arr[i];
    10. if (!map[ai[property]]) map[ai[property]] = [ai];
    11. else map[ai[property]].push(ai);
    12. }
    13. let res = [];
    14. Object.keys(map).forEach((key) => {
    15. res.push({ [property]: key, data: map[key] });
    16. });
    17. return res;
    18. },

    JS 将数组分为 n 个一组

    const list = [
      { id: 1, name: '宰父谷枫' },
      { id: 2, name: '买孟' },
      { id: 3, name: '疏学林' },
      { id: 4, name: '次如风' },
      { id: 5, name: '巧紫雪' }
    ];
    console.log(this.datumGroup(list, 3));

    1. /** 将数组分为 n 个一组
    2. * @param data 需要操作的数组数据
    3. * @param n 多少个为一组(默认4个为一组)
    4. * @returns {*[]} 已分好组的数组
    5. */
    6. datumGroup(data, n = 4) {
    7. let newArr = [];
    8. for (let i = 0, j = data.length; i < j; i += n) {
    9. newArr.push(data.slice(i, i + n));
    10. }
    11. return newArr;
    12. },

    JS 数组根据特定规则进行排序

     const list = [

      { id: 1, name: '张三' },

      { id: 2, name: '邬如风' },

      { id: 3, name: '童雯华' },

      { id: 4, name: '续馨香' },

      { id: 5, name: '骑萌' },

      { id: 6, name: '平慕雁' }

    ];

    const sequence = [4, 5, 6, 1, 2, 3]; // 排序规则

    console.log(this.specificSort(list, sequence, 'id'));

    1. /** 根据指定的字段与排序规则进行数组排序
    2. * @param arr 需要排序的数组
    3. * @param rule 指定排序规则
    4. * @param property 排序的字段
    5. * @returns {*} 排好序后的数组
    6. */
    7. specificSort(arr, rule, property) {
    8. return arr.sort((a, b) => {
    9. return rule.indexOf(a[property]) - rule.indexOf(b[property]);
    10. });
    11. },

    JS 数组对象合并,并删除重复项

    const arr1 = [{ id: "1", value: 10 }, { id: "2", value: 20 }];
    const arr2 = [{ id: "1", value: 10 }, { id: "2", value: 20 }, { id: "3", value: 30 }];
    console.log(this.arrObjMergeDelRepeat(arr1, arr2)); // [{"id":"1","value":10},{"id":"2","value":20},{"id":"3","value":30}]

    1. /** 数组对象合并,并删除重复项
    2. * @param {Object} arr1 需要合并的数组1
    3. * @param {Object} arr2 需要合并的数组2
    4. * @returns {*} 已合并且删除重复项的数组
    5. */
    6. arrObjMergeDelRepeat(arr1, arr2) {
    7. const ids = new Set(arr1.map(({ id }) => id));
    8. return [...arr1, ...arr2.filter(({ id }) => !ids.has(id))];
    9. },

    JS 数组根据传入的字段重构为嵌套结构

    const list = [
      { name: 'test-demo-index', path: 'test/demo/index.html' },
      { name: 'test-demo-list', path: 'test/demo/list.html' },
      { name: 'test-demo1-index', path: 'test/demo1/index.html' },
      { name: 'test1-demo-index', path: 'test1/demo/index.html' }
    ];
    console.log(this.buildNestedStructure(list, 'path'));

    1. /** 数组根据传入的字段重构为嵌套结构
    2. * @param arr 需要重构的数组
    3. * @param property 指定重构的字段
    4. * @param nodeName 嵌套结构的节点名称,默认:label
    5. * @param childName 嵌套结构的子节点名称,默认:children
    6. * @returns {*[]} 重构后的数组
    7. */
    8. buildNestedStructure(arr, property, nodeName = 'label', childName = 'children') {
    9. const result = []
    10. arr.forEach(item => {
    11. const parts = item[property].split('/')
    12. let curLevel = result
    13. parts.forEach(part => {
    14. const existingNode = curLevel.find(node => node[nodeName] === part)
    15. if (!existingNode) {
    16. const newNode = { [nodeName]: part, [childName]: [], ...item }
    17. curLevel.push(newNode)
    18. curLevel = newNode[childName]
    19. } else {
    20. curLevel = existingNode[childName]
    21. }
    22. })
    23. })
    24. return result
    25. },

    JS 数组根据传入的字段重构为阶梯结构

    const list = [
      { name: 'test-demo-index', path: 'test/demo/index.html' },
      { name: 'test-demo-list', path: 'test/demo/list.html' },
      { name: 'test-demo1-index', path: 'test/demo1/index.html' },
      { name: 'test1-demo-index', path: 'test1/demo/index.html' }
    ];
    console.log(this.buildLadderStructure(list, 'path'));

    1. /** 数组根据传入的字段重构为阶梯结构
    2. * @param arr 需要重构的数组
    3. * @param property 指定重构的字段
    4. * @param nodeName 节点名称,默认:label
    5. * @returns {*[]} 重构后的数组
    6. */
    7. buildLadderStructure(arr, property, nodeName = 'label') {
    8. const result = []
    9. const uniqueVal = new Set()
    10. arr.forEach(item => {
    11. const parts = item[property].split('/')
    12. let curValue = ''
    13. parts.forEach(part => {
    14. curValue = curValue ? `${curValue}/${part}` : part
    15. // 添加到输出数组和 Set 中(如果尚未存在)
    16. if (!uniqueVal.has(curValue)) {
    17. uniqueVal.add(curValue)
    18. result.push({ [nodeName]: curValue, ...item })
    19. }
    20. })
    21. })
    22. return result
    23. },

    JS 根据传入的值对数组进行递归查询

    1. const list = [
    2. {
    3. 'label': 'test',
    4. 'pathLevel': 'test',
    5. 'rank': 1,
    6. 'rankTotal': 3,
    7. 'children': [
    8. {
    9. 'label': 'demo',
    10. 'pathLevel': 'test/demo',
    11. 'rank': 2,
    12. 'rankTotal': 3,
    13. 'children': [
    14. {
    15. 'label': 'index.html',
    16. 'pathLevel': 'test/demo/index.html',
    17. 'rank': 3,
    18. 'rankTotal': 3,
    19. 'children': [],
    20. 'name': 'test-demo-index',
    21. 'path': 'test/demo/index.html'
    22. },
    23. {
    24. 'label': 'list.html',
    25. 'pathLevel': 'test/demo/list.html',
    26. 'rank': 3,
    27. 'rankTotal': 3,
    28. 'children': [],
    29. 'name': 'test-demo-list',
    30. 'path': 'test/demo/list.html'
    31. }
    32. ],
    33. 'name': 'test-demo-index',
    34. 'path': 'test/demo/index.html'
    35. },
    36. {
    37. 'label': 'demo1',
    38. 'pathLevel': 'test/demo1',
    39. 'rank': 2,
    40. 'rankTotal': 3,
    41. 'children': [
    42. {
    43. 'label': 'index.html',
    44. 'pathLevel': 'test/demo1/index.html',
    45. 'rank': 3,
    46. 'rankTotal': 3,
    47. 'children': [],
    48. 'name': 'test-demo1-index',
    49. 'path': 'test/demo1/index.html'
    50. }
    51. ],
    52. 'name': 'test-demo1-index',
    53. 'path': 'test/demo1/index.html'
    54. }
    55. ],
    56. 'name': 'test-demo-index',
    57. 'path': 'test/demo/index.html'
    58. },
    59. {
    60. 'label': 'test1',
    61. 'pathLevel': 'test1',
    62. 'rank': 1,
    63. 'rankTotal': 3,
    64. 'children': [
    65. {
    66. 'label': 'demo',
    67. 'pathLevel': 'test1/demo',
    68. 'rank': 2,
    69. 'rankTotal': 3,
    70. 'children': [
    71. {
    72. 'label': 'index.html',
    73. 'pathLevel': 'test1/demo/index.html',
    74. 'rank': 3,
    75. 'rankTotal': 3,
    76. 'children': [],
    77. 'name': 'test1-demo-index',
    78. 'path': 'test1/demo/index.html'
    79. }
    80. ],
    81. 'name': 'test1-demo-index',
    82. 'path': 'test1/demo/index.html'
    83. }
    84. ],
    85. 'name': 'test1-demo-index',
    86. 'path': 'test1/demo/index.html'
    87. }
    88. ];

    console.log(this.recursiveFindArr(list, 'label', 'demo'));

    1. /** 根据传入的值对数组进行递归查询
    2. * @param arr 需要查询的数组
    3. * @param property 指定查询的字段,例如:name
    4. * @param target 需要查询的值,例如:张三
    5. * @param childName 子节点名称,默认:children
    6. * @returns {*|null} 查询结果
    7. */
    8. recursiveFindArr(arr, property, target, childName = 'children') {
    9. for (const item of arr) {
    10. if (item[property] === target) return item
    11. if (item[childName] && item[childName].length > 0) {
    12. const result = this.recursiveFindArr(item[childName], property, target, childName)
    13. if (result) return result
    14. }
    15. }
    16. return null
    17. },

  • 相关阅读:
    【数据结构基础_树】Leetcode 230.二叉搜索树中第k小的元素
    合并RxJava的Observable数据流
    【目标检测】YOLOv5:添加漏检率和虚检率输出
    Linux基础:软件包的管理
    WPS增加正则处理函数,简直如虎添翼
    探索未来金融科技 SCF新加坡举办启动盛会
    μC/OS-II---信号量管理1(os_sem.c)
    OFD文件WEB前端展示-easyofd(1.0.6)
    【微信小程序】缓存数据库操作类——prototype和ES6方法
    java基于springboot+vue公司员工工资考勤管理系统
  • 原文地址:https://blog.csdn.net/AdminGuan/article/details/127997961