BLE设备数据采集:如何将时间与加速度数组转为键值对?
解决方案
首先,你当前的代码是把time和acc_dx作为独立元素依次添加到数组里,导致array_acc_dx变成了扁平的交替结构。要得到你想要的键值对形式,只需要修改数组更新的逻辑,每次添加一个包含时间和加速度的键值对对象即可。
步骤1:修正数组更新逻辑
把原有的数组更新代码替换成下面的写法,每次向数组中添加一个键值对对象,而不是分开添加时间和加速度:
// 替换原有的accUpdate_acc_dx定义 const accUpdate_acc_dx = [ ...this.state.array_acc_dx, { [this.state.time]: this.state.acc_dx } // 用时间作为键,加速度数组作为值 ]; this.setState({ array_acc_dx: accUpdate_acc_dx });
这样更新后,array_acc_dx的结构会变成:
[ { 1520: [42,-419,-926] }, { 1520: [41,-420,-927] }, { 1520: [41,-421,-927] }, { 1580: [40,-420,-927] }, ... ]
步骤2:格式化输出为目标字符串
如果你需要把这个数组转换成你展示的那种字符串格式(比如1520: [42,-419,-926], 1520: [41,-420,-927], ...),可以用map和join来处理:
const formattedResult = this.state.array_acc_dx.map(item => { // 取出每个对象中的键(时间)和值(加速度数组) const [time, accArray] = Object.entries(item)[0]; // 拼接成目标格式的字符串 return `${time}: [${accArray.join(',')}]`; }).join(', '); console.log(formattedResult); // 输出:1520: [42,-419,-926], 1520: [41,-420,-927], 1520: [41,-421,-927], 1580: [40,-420,-927]
额外优化:简化时间解析逻辑
你的原代码中解析时间的步骤有点冗余,readUInt16LE已经直接返回数字了,不需要再转十六进制字符串再parseInt,可以简化成:
const time = Buffer.from(characteristic.value, "base64").readUInt16LE(0);
这样能减少不必要的类型转换,提升代码效率。
内容的提问来源于stack exchange,提问作者Jack23
相关产品推荐
相关产品推荐

