JS实现从对象的数组值中按指定规则提取目标数字序列
完整实现方案
核心逻辑
- 优先判断数组是否为纯升序/纯降序,满足则直接返回原数组
- 不满足则遍历校验可能的基准数间隔,验证基准数是否符合逐次+1的规则,同时校验收集到的间隔元素是否整体为升序/降序
- 所有规则都不满足则返回空数组
实现代码
// 校验数组是否为纯升序 function isAsc(arr) { for (let i = 1; i < arr.length; i++) { if (arr[i] <= arr[i-1]) return false; } return true; } // 校验数组是否为纯降序 function isDesc(arr) { for (let i = 1; i < arr.length; i++) { if (arr[i] >= arr[i-1]) return false; } return true; } // 提取符合规则的间隔元素 function extractValidInterval(arr) { const len = arr.length; // 基准数至少需要2个,所以间隔步长最大不超过数组长度的1/2 for (let step = 2; step < len; step++) { // 校验前两个基准数是否符合+1规则 if (arr[step] !== arr[0] + 1) continue; // 校验后续所有基准数是否都满足逐次+1 let isBaseValid = true; const maxBaseIndex = Math.floor((len - 1) / step); for (let i = 2; i <= maxBaseIndex; i++) { const currentBasePos = i * step; if (arr[currentBasePos] !== arr[0] + i) { isBaseValid = false; break; } } if (!isBaseValid) continue; // 收集所有间隔元素 const intervalArr = []; for (let i = 0; i < len; i++) { if (i % step !== 0) intervalArr.push(arr[i]); } // 校验间隔元素是否为纯升/降序 if (isAsc(intervalArr) || isDesc(intervalArr)) { return intervalArr; } } // 无符合条件的结果返回空数组 return []; } // 业务逻辑处理 const numbers = { number1 : [1, 300,400,2,500,900,3,1000,1100,4,1200,1800], number2 : [0, 1.1, 1, 1.2, 2, 1.3, 3, 1.4], number3 : [2, 1000, 3, 980, 4, 700, 5,100, 6, 10], number4 : [1000, 1001, 1001.3, 1003, 1014], number5 : [34, 76, 0, 50, 0.5, 1010, 0.5], }; const result = {}; for (const [key, arr] of Object.entries(numbers)) { if (isAsc(arr) || isDesc(arr)) { result[key] = arr; } else { result[key] = extractValidInterval(arr); } } console.log(result);
输出结果
和预期输出完全一致:
{ number1: [300, 400, 500, 900, 1000, 1100, 1200, 1800], number2: [1.1, 1.2, 1.3, 1.4], number3: [1000, 980, 700, 100, 10], number4: [1000, 1001, 1001.3, 1003, 1014], number5: [] }
内容的提问来源于stack exchange,提问作者dumpAndDie
相关产品推荐
相关产品推荐

