关于前端:关于递归-整理

对于递归,算法当中根底中的根底,把握不好,所有算法都是0.
以下是几个递归,在了解当中记忆,记录它们重在了解,不在记忆。

1、多维数组打成map映射。

const buildMapDataSource = (
  dataSource,
  target = {},
  level = 1,
  parentKey = null,
) => {
  for (let i = 0; i < dataSource.length; i++) {
    const item = dataSource[i];
    let key = !parentKey ? `${i}` : `${parentKey}-${i}`;
    if (!target[item.id]) {
      target[item.id] = item;
      item.level = level;
      item.key = key;
    }
    if (Array.isArray(item?.children)) {
      buildMapDataSource(item.children, target, level + 1, key);
    }
  }
  return target;
};

2、多维数组,每项打入key,示意层级,相似key=’0-0-0-1′.

const buildStandardArr = (data, parentId = null) => {
  const result = [];

  data.forEach((item, index) => {
    if (item.parentId === parentId) {
      const key = parentId !== null ? `${parentId}-${index}` : `${index}`;
      const newItem = { ...item, key };
      const children = buildStandardArr(data, item.id);
      if (Array.isArray(children) && children.length) {
        newItem.children = children;
      }
      result.push(newItem);
    }
  });

  return result;
}

3、把一维打成tree多维,集体感觉这个比拟难了解;

const buildMultipleArr = (data, parentId = null) => {
  const result = [];
  data.forEach(item => {
    if (item.parentId === parentId) {
      const children = buildMultipleArr(data, item.id);
      const newItem = { ...item };
      if (Array.isArray(children) && children.length) {
        newItem.children = children;
      }
      result.push(newItem);
    }
  });

  return result;
};

4、通过parentId获取parent

const getParent = (data, parentId = null, parent = null) => {
  for (let i = 0; i < data.length; i++) {
    const item = data[i];
    if (item.parentId === parentId) {
      return parent;
    }
    if (Array.isArray(item?.children) && item.children.length) {
      const parent = getParent(item.children, parentId, item);
      if (parent) {
        return parent;
      }
    }
  }
  return null;
}

5、对多维数组,外部的节点排序

const sortNodes = (data) => {
  data.sort((a, b) => a.sort - b.sort)
  data.forEach(item => {
    if (Array.isArray(item?.children) && item.children.length) {
      sortNodes(item.children);
    }
  });

  return data;
}

6、获取多维数组,某一项Item外部(有多层children嵌套)最大的层级

const getMaxLevel = (obj) => {
  let maxLevel = 0;
  function traverse(node, level) {
    if (level > maxLevel) {
      maxLevel = level;
    }
    if (Array.isArray(node.children)) {
      node.children.forEach(child => {
        traverse(child, child.level);
      });
    }
  }

  traverse(obj, obj.level);
  return maxLevel;
}

从下面的例子来看
须要数组push的,都是先写递归函数,再写push追加的内容
须要返回一个object的,都是先写逻辑,再写递归函数

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理