基于值分类数组元素并为相同时间戳分配连续递增数值
嘿,我来帮你搞定这两个数组处理的需求!先把问题拆解清楚,然后一步步给你提供可落地的实现方案~
需求1:基于值对数组元素进行分类
这个需求的核心是把数组中相同值的元素归为一组,最终得到一个以元素值为键、对应元素集合为值的对象。我们可以用JavaScript的reduce方法轻松实现:
function groupElementsByValue(arr) { return arr.reduce((groupedObj, currentVal) => { // 如果当前值还没在分组对象里,先初始化一个空数组 if (!groupedObj[currentVal]) { groupedObj[currentVal] = []; } // 将当前值推入对应分组的数组 groupedObj[currentVal].push(currentVal); return groupedObj; }, {}); // 初始值是一个空对象 } // 测试用例 const testArr = [5, 2, 5, 3, 2, 5]; console.log(groupElementsByValue(testArr)); // 输出:{ '2': [ 2, 2 ], '3': [ 3 ], '5': [ 5, 5, 5 ] }
简单说下逻辑:reduce会遍历数组的每一个元素,用累加器groupedObj来存储分组结果。每遇到一个元素,就把它加到对应值的数组里,最终就能得到按值分类的结构。
需求2:为相同timestamp分配递增的分组数值
这个需求要求相同的timestamp对应相同的数字,且数字按分组出现的顺序依次递增(比如第一个新出现的timestamp对应1,第二个新的对应2,以此类推)。这里用Map来缓存已出现的timestamp和对应的编号是最优方案:
function assignGroupNumbers(timestampArray) { const timestampToNumber = new Map(); let currentGroupNumber = 1; return timestampArray.map(timestamp => { // 如果这个timestamp还没被记录过,分配当前编号并递增 if (!timestampToNumber.has(timestamp)) { timestampToNumber.set(timestamp, currentGroupNumber); currentGroupNumber++; } // 返回对应的分组编号 return timestampToNumber.get(timestamp); }); } // 测试用例(和你给出的示例一致) const timestamps = [1630000000, 1630000000, 1630000000, 1630003600, 1630003600, 1630003600]; const numericArray = assignGroupNumbers(timestamps); console.log(numericArray); // 输出:[1, 1, 1, 2, 2, 2]
逻辑解释:Map用来存储已经遇到过的timestamp和对应的分组号,遍历数组时,每遇到一个新的timestamp,就给它分配当前的currentGroupNumber,然后把编号加1。这样既能保证相同timestamp对应相同编号,又能让编号按出现顺序递增。
内容的提问来源于stack exchange,提问作者casillas
相关产品推荐
相关产品推荐

