如何将对象数组的posi值转换为符合规则的level索引值?
问题解决:将posi值转换为指定规则的level值
原始数组
var val = [ { posi: 6, }, { posi: 4.5, }, { posi: 2, }, { posi: 7.5, }, { posi: 2, }, { posi: 5, }, { posi: 3.5, }, ];
转换规则与期望输出
转换规则:
- 维护一个基础整数level值,初始为1
- 若当前元素的
posi是带.5的小数,当前元素的level为基础整数值 + 0.5,基础整数值保持不变 - 若当前元素的
posi是整数,当前元素的level为基础整数值,之后基础整数值加1
期望输出:
var val = [ { level: 1, }, { level: 1.5, }, { level: 2, }, { level: 2.5, }, { level: 3, }, { level: 4, }, { level: 4.5, }, ];
你的错误代码及输出
你原本的代码存在两个问题:一是误将不存在的le.level作为判断字段(原数组只有posi),二是没有正确维护递增的基础level值,导致输出不符合预期:
val = val.map((le, po) => { return { level: po + 1 - (le.level % 1 === 0.5 ? 0.5 : 0), }; });
实际输出:
[{"level":1},{"level":1.5},{"level":3},{"level":3.5},{"level":5},{"level":6},{"level":6.5}]
正确解决方案
我们需要用一个外部变量追踪当前的基础整数level,遍历数组时根据posi的类型动态更新level值:
let currentLevel = 1; val = val.map(item => { const isHalf = item.posi % 1 === 0.5; const level = isHalf ? currentLevel + 0.5 : currentLevel; // 仅当posi为整数时,递增基础level if (!isHalf) { currentLevel++; } return { level }; });
执行这段代码后,就能得到符合预期的输出结果。
内容的提问来源于stack exchange,提问作者Township
相关产品推荐
相关产品推荐

