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));

/** 根据传入的字段进行排序
 * @param arr 需要排序的数组
 * @param property 排序的字段
 * @param desc true.升序 false.降序
 * @returns {*} 排好序后的数组
 */
abilitySort(arr, property, desc) {
  return arr.sort(function (a, b) {
    const val1 = a[property];
    const val2 = b[property];
    if (desc) {
      return val1 - val2; // 升序排列
    } else {
      return val2 - val1; // 降序排列
    }
  });
},

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"));

/** 根据传入的字段进行分组
 * @param arr 需要分组的数组
 * @param property 分组的字段
 * @returns {*[]} 已分好组的数组
 */
abilitySort(arr, property) {
  let map = {};
  for (let i = 0; i < arr.length; i++) {
    const ai = arr[i];
    if (!map[ai[property]]) map[ai[property]] = [ai];
    else map[ai[property]].push(ai);
  }
  let res = [];
  Object.keys(map).forEach((key) => {
    res.push({ [property]: key, data: map[key] });
  });
  return res;
},

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));

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

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'));

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

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}]

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

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'));

/** 数组根据传入的字段重构为嵌套结构
 * @param arr 需要重构的数组
 * @param property 指定重构的字段
 * @param nodeName 嵌套结构的节点名称,默认:label
 * @param childName 嵌套结构的子节点名称,默认:children
 * @returns {*[]} 重构后的数组
 */
buildNestedStructure(arr, property, nodeName = 'label', childName = 'children') {
  const result = []
  arr.forEach(item => {
    const parts = item[property].split('/')
    let curLevel = result
    parts.forEach(part => {
      const existingNode = curLevel.find(node => node[nodeName] === part)
      if (!existingNode) {
        const newNode = { [nodeName]: part, [childName]: [], ...item }
        curLevel.push(newNode)
        curLevel = newNode[childName]
      } else {
        curLevel = existingNode[childName]
      }
    })
  })
  return result
},

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'));

/** 数组根据传入的字段重构为阶梯结构
 * @param arr 需要重构的数组
 * @param property 指定重构的字段
 * @param nodeName 节点名称,默认:label
 * @returns {*[]} 重构后的数组
 */
buildLadderStructure(arr, property, nodeName = 'label') {
  const result = []
  const uniqueVal = new Set()
  arr.forEach(item => {
    const parts = item[property].split('/')
    let curValue = ''
    parts.forEach(part => {
      curValue = curValue ? `${curValue}/${part}` : part
      // 添加到输出数组和 Set 中(如果尚未存在)
      if (!uniqueVal.has(curValue)) {
        uniqueVal.add(curValue)
        result.push({ [nodeName]: curValue, ...item })
      }
    })
  })
  return result
},

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

const list = [
  {
    'label': 'test',
    'pathLevel': 'test',
    'rank': 1,
    'rankTotal': 3,
    'children': [
      {
        'label': 'demo',
        'pathLevel': 'test/demo',
        'rank': 2,
        'rankTotal': 3,
        'children': [
          {
            'label': 'index.html',
            'pathLevel': 'test/demo/index.html',
            'rank': 3,
            'rankTotal': 3,
            'children': [],
            'name': 'test-demo-index',
            'path': 'test/demo/index.html'
          },
          {
            'label': 'list.html',
            'pathLevel': 'test/demo/list.html',
            'rank': 3,
            'rankTotal': 3,
            'children': [],
            'name': 'test-demo-list',
            'path': 'test/demo/list.html'
          }
        ],
        'name': 'test-demo-index',
        'path': 'test/demo/index.html'
      },
      {
        'label': 'demo1',
        'pathLevel': 'test/demo1',
        'rank': 2,
        'rankTotal': 3,
        'children': [
          {
            'label': 'index.html',
            'pathLevel': 'test/demo1/index.html',
            'rank': 3,
            'rankTotal': 3,
            'children': [],
            'name': 'test-demo1-index',
            'path': 'test/demo1/index.html'
          }
        ],
        'name': 'test-demo1-index',
        'path': 'test/demo1/index.html'
      }
    ],
    'name': 'test-demo-index',
    'path': 'test/demo/index.html'
  },
  {
    'label': 'test1',
    'pathLevel': 'test1',
    'rank': 1,
    'rankTotal': 3,
    'children': [
      {
        'label': 'demo',
        'pathLevel': 'test1/demo',
        'rank': 2,
        'rankTotal': 3,
        'children': [
          {
            'label': 'index.html',
            'pathLevel': 'test1/demo/index.html',
            'rank': 3,
            'rankTotal': 3,
            'children': [],
            'name': 'test1-demo-index',
            'path': 'test1/demo/index.html'
          }
        ],
        'name': 'test1-demo-index',
        'path': 'test1/demo/index.html'
      }
    ],
    'name': 'test1-demo-index',
    'path': 'test1/demo/index.html'
  }
];

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

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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数组的快速排序算法是一种常用的排序算法,其基本思想是通过分治的方法将数组不断划分为较小的子数组,并将较小的子数组排序,最终合并得到有序数组。下面是一种常见的实现方式: 1. 选择数组中的一个元素作为基准值(pivot)。 2. 将数组划分为两个子数组,一个子数组中的元素小于或等于基准值,另一个子数组中的元素大于基准值。可以使用双指针法或者双边循环法实现划分过程。 3. 对两个子数组分别进行递归调用快速排序算法。 4. 合并两个子数组,即将基准值放置在两个子数组的中间位置。 5. 重复上述步骤,直到每个子数组只包含一个元素或为空。 以下是使用递归实现的快速排序的示例代码(使用双边循环法): ```python def quick_sort(arr, low, high): if low < high: # 划分数组 pivot_index = partition(arr, low, high) # 对左右子数组递归调用快速排序 quick_sort(arr, low, pivot_index - 1) quick_sort(arr, pivot_index + 1, high) def partition(arr, low, high): # 选择最右边的元素作为基准值 pivot = arr[high] # 初始化左右指针 i = low - 1 for j in range(low, high): if arr[j] <= pivot: # 将小于等于基准值的元素交换到左侧区域 i += 1 arr[i], arr[j] = arr[j], arr[i] # 将基准值放置到正确的位置 arr[i + 1], arr[high] = arr[high], arr[i + 1] # 返回基准值的索引 return i + 1 # 测试代码 arr = [5, 2, 9, 3, 7, 6, 8, 1, 4] quick_sort(arr, 0, len(arr) - 1) print(arr) # 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9] ``` 以上代码演示了如何对一个整型数组进行快速排序。在实际应用中,可以根据需要修改代码以适应不同类型的数组排序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值