如何在JavaScript对象上反转键顺序

nxowjjhe  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(122)

我需要对JavaScript对象中所有键的顺序进行深度反转。
例如:

{
  a: 'val1',
  b: 'val2',
  c: {
    ca: 'val3',
    cb: 'val4'
  }
}

必须成为:

{
  c: {
    cb: 'val4',
    ca: 'val3'
  },
  b: 'val2',
  a: 'val1'
}

我试过写一个递归函数,但是我不知道如何修复它:

function reverseKeys (obj, newObj = {}) {
  Object.keys(obj).reverse().forEach(key => {
    if(typeof obj[key] === 'object') {
      newObj = reverseKeys(obj[key], {})
    }
    newObj[key] = obj[key]
  })
  return newObj
}
    • 解决方案灵感来自@Unmitigate的意见**
function reverseKeys (obj) {
  return Object.fromEntries(
    Object.entries(obj)
      .reverse()
      .map(
        ([k, v]) => {
          if (v.constructor === Object && v.constructor !== Array && v !== null) {
            return [k, reverseKeys(v)]
          } else if (v.constructor === Array && v !== null) {
            const a = []
            v.forEach(elem => {
              if ((elem.constructor === Object || elem.constructor === Array) && elem !== null) {
                a.push(reverseKeys(elem))
              } else {
                a.push(elem)
              }
            })
            return [k, a]
          } else {
            return [k, v]
          }
        }
      )
  )
}
sh7euo9m

sh7euo9m1#

可以递归地在Object.entries上执行map

let o = {
  a: 'val1',
  b: 'val2',
  c: {
    ca: 'val3',
    cb: 'val4'
  },
  d: [{a : 1, b : 2}, {c: 3}]
};
function reverseKeys(obj) {
  if (Array.isArray(obj)) return [...obj].reverse().map(reverseKeys);
  if (Object.getPrototypeOf(obj) === Object.prototype) 
    return Object.fromEntries(Object.entries(obj).reverse()
      .map(([k, v]) => [k, reverseKeys(v)]));
  return obj;
}
console.log(reverseKeys(o));

相关问题