You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重排对象数组中每个对象的内部键顺序而非对数组本身排序

报错原因

你代码报错的核心问题是:move函数接收的参数是数组内的对象元素,而splice是JavaScript数组的专属方法,普通对象不存在该方法,因此调用thearr.splice时直接抛出异常。

补充说明:ES6+规范中普通对象的字符串类型键会严格按照插入顺序存储排列,因此我们可以通过重新构造对象的方式调整键的顺序。


场景专属解决方案(适配你当前的需求)

你需要的是把id放到name之前,其余键顺序不变,直接遍历数组重构每个对象即可,代码最简:

$scope.reorderObjKeys = (originArr) => {
  return originArr.map(item => {
    return {
      id: item.id,
      name: item.name,
      address: item.address
    }
  })
}

// 调用示例
const reorderedArr = $scope.reorderObjKeys(obj)

通用解决方案(支持任意键位置调整)

如果你需要更通用的、支持指定任意键移动到指定位置的方法,可以参考以下实现:

/**
 * 重排对象内部键顺序
 * @param {Object} obj 要处理的原对象
 * @param {String} key 要移动的键名
 * @param {Number} targetIndex 目标索引位置(从0开始)
 * @returns {Object} 调整键顺序后的新对象
 */
const moveObjKeyToIndex = (obj, key, targetIndex) => {
  const keys = Object.keys(obj)
  // 先拿到当前键的索引
  const currentIndex = keys.indexOf(key)
  if (currentIndex === -1 || currentIndex === targetIndex) return obj
  // 调整键数组的顺序
  keys.splice(targetIndex, 0, keys.splice(currentIndex, 1)[0])
  // 按新的键顺序构造新对象
  return keys.reduce((newObj, k) => {
    newObj[k] = obj[k]
    return newObj
  }, {})
}

// 遍历数组调整每个对象的键顺序
$scope.arraymove = (arr, moveKey, targetIndex) => {
  return arr.map(item => moveObjKeyToIndex(item, moveKey, targetIndex))
}

// 调用示例:把id键移到索引0的位置
const reorderedArr = $scope.arraymove(obj, 'id', 0)

注意事项

  • 以上实现均返回新数组/新对象,不会修改原数据,避免产生副作用
  • 该特性依赖ES6+对象键顺序规范,如果需要兼容IE8及以下的极端老旧环境,不建议依赖对象键顺序做逻辑处理,建议取值时明确指定键名

内容的提问来源于stack exchange,提问作者Peter The Angular Dude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:06:00