最普遍的填充就是没有规律的时候复制对应位置的内容,可以标记为:
NORMAL_RULE = ({ value }) => {return value;};

一、数字类型

数字类型的填充可以归结为一点:最小二乘拟合。因此你需要知道什么是最小二乘拟合(https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/2522346?fromtitle=%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%8B%9F%E5%90%88&fromid=6260453&fr=aladdin).


/*numberList: 找规律的数据,是一个数组return: 返回的是一个填充的规律规律接受参数为填充的第几项
*/
getLeastSquares(numberList) {let slope, intercept, xAverage, yAverage;let xSum = 0, ySum = 0, xSquareSum = 0, xySum = 0;let validCellsLen = 0;let emptyCellPositions = [];numberList.forEach((v, i) => {if (v !== undefined && v !== null && v !== '') {validCellsLen++;xSum += i;ySum += v;xySum += (v * i);xSquareSum += Math.pow(i, 2);} else {emptyCellPositions.push(i);}});if (validCellsLen < 2) { // 长度小于2的,直接认为是复制对应位置的内容return NORMAL_RULE;}xAverage = xSum / validCellsLen;yAverage = ySum / validCellsLen;slope = (xySum - validCellsLen * xAverage * yAverage) / (xSquareSum - validCellsLen * Math.pow(xAverage, 2));intercept = yAverage - slope * xAverage;return ({ n }) => {if (emptyCellPositions.length && emptyCellPositions.includes(n % numberList.length)) {return '';}let y = n * slope + intercept; // 拟合公式:y = k * x + breturn Number(parseFloat(y).toFixed(8)); };}

二、文本类型

文本类型需要注意的是当遇见数字的时候,遇见数字时,如果仅是数字部分不同,要按照数字部分的规律进行填充

const REG_STRING_NUMBER_PARTS = /\d+|\D+/g; // 将字符串进行切分const REG_NUMBER_DIGIT = /\d/; // 匹配数字// 是不是顺序数列function isArithmeticSequence(numberList) {let number0 = numberList[0];let tolerance = numberList[1] - number0;let func = (v, n) => {return v === n * (tolerance) + number0;};return numberList.every(func);}function getTextItemStructureInfo(textItem) {let validTextItem = textItem || '';let lastNumberPosition = -1, lastNumber = validTextItem;let valueList = validTextItem.match(REG_STRING_NUMBER_PARTS); // 是否存在数字部分for (let i = valueList.length - 1; i > -1; i--) {let valueItem = valueList[i];if (REG_NUMBER_DIGIT.test(valueItem)) { // 寻找最末尾的数字部分下标lastNumberPosition = i;lastNumber = valueItem;break;}}if (lastNumberPosition !== -1) {valueList[lastNumberPosition] = '-|*|-|*|-|*|-'; // 标识无特殊意义}return {lastNumberPosition, lastNumber, structure: valueList.join('')};}function getTextFillNumberRule(valueList, lastNumber, lastNumberPosition, fillFunc) {let isStartWith0 = lastNumber.startsWith('0');return ({ n }) => {let fillValue = fillFunc ? fillFunc({lastNumber, n}) : '';if (isStartWith0 && fillValue.length < lastNumber.length) {fillValue = '0'.repeat(lastNumber.length - fillValue.length) + fillValue;}valueList[lastNumberPosition] = fillValue;return valueList.join('');}; }function getTextRule(textList) {let isAllNotIncludeNumber = textList.every(item => !REG_NUMBER_DIGIT.test(item || ''));if (isAllNotIncludeNumber) {return NORMAL_RULE;}if (textList.length === 1) {let valueList = textList[0].match(REG_STRING_NUMBER_PARTS);let { lastNumberPosition, lastNumber } = getTextItemStructureInfo(textList[0]);return getTextFillNumberRule(valueList, lastNumber, lastNumberPosition, ({lastNumber, n}) => {let lastNumberValue = parseInt(lastNumber, 10);return (lastNumberValue + n) + '';});}// isStructureConsistent: the last number part is not equal, other is equallet structureList = textList.map((text) => getTextItemStructureInfo(text));let firstStructure = structureList[0];let isStructureConsistent = structureList.every(structure => structure['lastNumberPosition'] === firstStructure['lastNumberPosition'] && structure['structure'] === firstStructure['structure']);if (isStructureConsistent) {let numberList = structureList.map(structure => parseInt(structure.lastNumber, 10));if (isArithmeticSequence(numberList)) {let valueList = textList[0].match(REG_STRING_NUMBER_PARTS);let secondStructure = structureList[1];  let secondStructureLastNumberValue = parseInt(secondStructure['lastNumber'], 10);return getTextFillNumberRule(valueList, firstStructure['lastNumber'], firstStructure['lastNumberPosition'], ({lastNumber, n}) => {let lastNumberValue = parseInt(lastNumber, 10);return (n * (secondStructureLastNumberValue - lastNumberValue) + lastNumberValue) + '';});}return NORMAL_RULE;}return ({value, n}) => {if (REG_NUMBER_DIGIT.test(value || '')) {let valueList = value.match(REG_STRING_NUMBER_PARTS);let { lastNumberPosition, lastNumber } = getTextItemStructureInfo(value);let isStartWith0 = lastNumber.startsWith('0');let lastNumberValue = parseInt(lastNumber, 10);let fillValue = (lastNumberValue + Math.floor(n / textList.length)) + '';if (isStartWith0 && fillValue.length < lastNumber.length) {fillValue = '0'.repeat(lastNumber.length - fillValue.length) + fillValue;}valueList[lastNumberPosition] = fillValue;return valueList.join('');}return value;};}

像excel一样规律填充(二)相关推荐

  1. 像excel一样规律填充(三)

    三.日期值 日期填充时应遵循一个原则:年 > 月 > 日/ 其他 ** 用到moment库// 获取日期的 从1970年1月1日0时0分0秒(UTC,即协调世界时)到该日期的毫秒数 get ...

  2. excel填充序列_猴哥讲述:excel的自动填充功能——自动填充单元格

    我们都知道excel的自动填充功能非常的好用,自动填充功能可以帮我们在工作中大大的提升工作效率,同时还可以准确无误的帮助我们进行数据自动输入,我们也可以自定义自动填充的序列. 一.自动填充功能,是指我 ...

  3. java填充二维数组_Java用Arrays.fill()初始化二维数组的实现

    在最短路径问题上遇到了一个问题,对于二维int数组 map[][],需要初始化为int的最大值,不想用双重循环赋初值,想用Arrays.fill()填充但是失败了...... 首先说明,Arrays. ...

  4. excel的批量填充(工作日、数字)

    今天讲讲excel如何批量填充数字! 一.举一个工作日期的日子 1.先在excel表格敲打出第一个日期如2019-1-1,我们要以日为单位填充到2019-12-31日 2.开始--行和列--填充--序 ...

  5. 转:TestLink1.9.3测试用例:Excel转换XML工具二实现代码

    TestLink1.9.3测试用例:Excel转换XML工具<二>实现代码 http://blog.csdn.net/candle806/article/details/7490599 以 ...

  6. java设置字体大小和颜色_Java 设置Excel图表背景填充(颜色、图片填充)

    本文介绍通过Java程序来设置Excel图表背景填充的方法,填充时,可设置颜色填充或者加载图片填充:填充区域可设置整个图表区域或者绘图区域.设置方法参考以下内容. 使用工具:Free Spire.XL ...

  7. Excel制作图表(二)--- 燃尽图

    https://blog.csdn.net/sxzlc/article/details/106291897 ■前言 比想象中的简单 ■其他图表制作 ・Excel 图表学习(一):商品销售量 https ...

  8. excel空白处自动填充内容怎么操作,excel空白处填充0或上行方法

    excel空白处自动填充内容 1.选择需要将空白处进行填充的区域 2.点击开始–>查找与替换–>定位条件或者按下F5–>点击定位条件. 3.进入定位条件界面后,点击选择空值,再点击确 ...

  9. Excel模板数据填充导出

    Excel模板数据填充导出 需求描述: POI实现 1.添加依赖: <dependency><groupId>org.apache.poi</groupId>< ...

最新文章

  1. python3 configparse 配置模块
  2. OI/ACM 刷题网站 人气OJ简介
  3. 【华为云技术分享】ArcFace简介
  4. 数据科学 IPython 笔记本 9.6 聚合:最小、最大和之间的任何东西
  5. 4.3 Siamese 网络
  6. ft232r usb uart驱动_构建基于USB的高精度温度传感器电路
  7. 【树链剖分】树链剖分讲解
  8. 软件项目总结报告范文
  9. 超实用的XRD数据定性分析方法,三分钟上手,科研小白变大神!
  10. 如何五分钟实现无线WEP网络入侵(ZZ)
  11. 简单好用的作图工具,除了Visio还有它!
  12. linux如何显示文件后缀名,如何在win7系统中显示文件后缀名、扩展名
  13. 微信公众号二次开发(1)
  14. 启发式搜索算法 - 以A*为中心来说明启发式算法本质是要找有效的heuristic需要满足的性质
  15. 如果把小程序业务和研发管理都放到一个平台
  16. 文档拍摄技巧之拍照与如何提高图像质量
  17. pmp-相关方权利/利益方格
  18. 【计组】字长、数据总线、地址总线
  19. lol哪个服务器能玩无限火力,《lol》2021无限火力时间表公告 无限火力什么时候开放...
  20. 一年前端的4月深圳面经

热门文章

  1. 【记录】JS回调函数(小例子)
  2. WinAPI: SetTimer、KillTimer - 创建与移除高性能定时器
  3. Winodws 10中pyCharm 2017安装
  4. nginx启动报错 :Failed to start The nginx HTTP and reverse prox...er.
  5. Win10 - 下方【任务栏】- 颜色设置方法
  6. 【HDFS】HDFS与getconf结合使用,获取配置信息
  7. 【Hive】Caused by: MetaException(message:Hive metastore database is not initialized. Please use schema
  8. framework7的改进,以及与vue组合使用遇到的问题以及解决方法 (附vue的原理)
  9. c语言递归解决汉诺塔问题
  10. Uncaught TypeError: Illegal invocation问题解决方法