首页 > 解决方案 > 在 javascript 中为几个属性交换对象值

问题描述

当前对象

const obj = {
  k1: v1,
  k2: v2,
  x1: v3,
  x2: v4,
  y: {
    z1: v5,
    z2: v6
  }
}

预期对象

const obj = {
  k1: v2,
  k2: v1,
  x1: v4,
  x2: v3,
  y: {
    z1: v6,
    z2: v5
  }
}

已经为每个键尝试了单独的交换方法,还尝试了下面的对象分配方式

const obj = {
  k1: 'v1',
  k2: 'v2',
  x1: 'v3',
  x2: 'v4',
  y: {
    z1: 'v5',
    z2: 'v6'
  }
}
Object.assign(obj, {
  k1: obj.k2,
  k2: obj.k1,
  x1: obj.x2,
  x2: obj.x1,
  y: {
    z1: obj.y.z2,
    z2: obj.y.z1,
  }
});

Object.keys(obj).forEach(
  (k) =>
    obj[k] === null ||
    (obj[k] === undefined && delete obj[k])
);

console.log(obj)

在某些情况下,一旦执行了对象分配,未定义将出现在 x1 或 x2 键上,因为 v3 或 v4 不是强制性的。所以在转换后试图从对象中删除未定义的键

期待一个优化和更好的解决方案

标签: javascript

解决方案


obj您的解决方案是从诸如添加未定义的键,obj.k4并且obj.k3它们也分配给了错误的键k3k4.

您更正的解决方案

const obj = {
  k1: 'v1',
  k2: 'v2',
  x1: 'v3',
  x2: 'v4',
  y: {
    z1: 'v5',
    z2: 'v6'
  }
};
Object.assign(obj, {
  k1: obj.k2,
  k2: obj.k1,
  x1: obj.x2,
  x2: obj.x1,
  y: {
    z1: obj.y.z2,
    z2: obj.y.z1,
  }
});
console.log(obj);

您也可以使用扩展运算符来实现相同的目的。

let obj = {
  k1: 'v1',
  k2: 'v2',
  x1: 'v3',
  x2: 'v4',
  y: {
    z1: 'v5',
    z2: 'v6'
  }
};
obj = {...obj, ...{
  k1: obj.k2,
  k2: obj.k1,
  x1: obj.x2,
  x2: obj.x1,
  y: {
    z1: obj.y.z2,
    z2: obj.y.z1,
  }
}}
console.log(obj);


推荐阅读