0

TLDR:如何使用解构来加速基于同一接口的另一个对象的一个​​对象的部分更新?

我想使用新的 ECMA2015 - 2017 JavaScript 来重构我的代码。

为简单起见,假设我有一个对象,如下所示:

export interface myObj {
  name:           string;
  id:             number;
  description:    string;
  someBool:       boolean;
  anotherBool:    boolean;
}

(导出界面有效,因为我正在使用 Typescript 在 Angular 中工作)。

这是旧的 es5 函数:

updateMyObj = function(oldObj, newObj) {
  var someBoolSaved = oldObj.someBool;
  var anotherBoolSaved = oldObj.anotherBool;
  oldObj = newObj;
  oldObj.someBool = someBoolSaved;
  oldObj.anotherBool = anotherBoolSaved;
}

如您所见,该函数应该更新 oldObj 的某些部分,但也保留一些部分。

这是我重构代码的尝试:

updateObj(oldObj, newObj) {
  let {someBool, anotherBool} = oldObj;
  oldObj = newObj;
  // Here is the part where I don't know how to proceed.
}

但我不知道,我现在如何将 oldObj 的布尔值分配给保存的布尔值。

一种不优雅的方式是

oldObj.someBool = someBool;
oldObj.anotherBool = anotherBool;

在这个例子中会很好。但是在我的实际任务中,这会花费很多代码行,这就是我想要重构的原因。

我只是想不出正确的语法。

我对此进行编码的尝试看起来像这样:

oldObj = {someBool, anotherBool}

但这不起作用。

4

2 回答 2

3

如果要将解构后的值分配给属性,可以通过在解构中指定 a 右侧的属性来实现:

例如:以下将newObj.aand分配newObj.coldObj.aand oldObj.c

({a: oldObj.a, c: oldObj.c} = newObj);
//   ^^^^^^^^-----^^^^^^^^---- destinations for a and c

(这()是必要的,因为否则{开头看起来像块的开头。如果我们已经在表达式上下文中,你就不需要它们。)

const oldObj = {a: "old a", b: "old b"};
const newObj = {a: "new a", c: "new c"};
({a: oldObj.a, c: oldObj.c} = newObj);
console.log(oldObj);

正如伯吉在对该问题的评论中指出的那样,它并没有真正让你买太多

oldObj.a = newObj.a;
oldObj.c = newObj.c;

这就是各种选择符号出现的原因之一(最近才看到活动)。如果该提议被接受(并且它甚至还没有冠军,所以不要屏住呼吸),你会有oldObj.{a, c} = newObj;.

于 2018-03-26T13:26:57.810 回答
0

const newObj = { ...oldObject, someBool: true, anotherBool: false};

编辑:

更新旧对象真的是您想要做的吗?

在您的原始代码中,您将 oldObj 变异为函数的副作用。这通常被视为不良做法。下面是一个没有副作用的纯函数示例。

const firstObj = { name: 'hi', someBool: true, anotherBool: true };
const secondObj = { name: 'bye', someBool: false }; 
const thirdObj = mergeObjects(firstObj, secondObj);
// work with thirdObj from now on

function mergeObjects(firstObj, secondObj): myObj {
  return { 
    ...secondObj,
    firstObj.someBool,
    firstObj.anotherBool 
  }
}
于 2018-03-26T13:25:17.733 回答