JavaScript中如何将含非连续数字键的对象转换为数组?
带不连续数字键的对象转稀疏数组的简便实现
最省事的写法
直接用Object.assign()就能搞定,它会把对象里的数字键对应的值直接放到数组的对应索引位置,缺的索引自动留空:
const toArray = (obj) => Object.assign([], obj); // 测试示例 const raggedArrayObj = {"0": 10, "1": 3, "3": 5}; const raggedArray = toArray(raggedArrayObj); // [10, 3, , 5]
为啥这方法能行?
数组本身就是特殊的对象,索引其实就是它的数字属性名。Object.assign()会遍历源对象的所有可枚举属性,把它们赋值给目标数组的对应索引。要是中间某个数字键没在对象里,数组的那个索引就会是空元素(注意这和undefined不一样,遍历数组的时候会跳过这种空元素)。
另一种写法(适合键不从0开始的情况)
如果你的对象键不是从0开始,比如{"2":4,"5":9},想确保数组长度刚好覆盖到最大的键,可以先找最大键值,再初始化数组赋值:
function toArray(obj) { const numKeys = Object.keys(obj).map(Number); if (numKeys.length === 0) return []; const maxIndex = Math.max(...numKeys); const arr = new Array(maxIndex + 1); numKeys.forEach(key => arr[key] = obj[key]); return arr; }
用这个方法处理{"2":4,"5":9},会得到[ , , 4, , , 9],长度刚好对应最大索引+1。
内容的提问来源于stack exchange,提问作者Adam B.
相关产品推荐
相关产品推荐

