JavaScript:反向对象解构/重构代码以更新对象
JavaScript: Reverse object destructuring / refactoring code to update object
TLDR: 如何使用解构加速一个对象基于同一接口的另一个对象的部分更新?
我想使用新的 ECMA2015 - 2017 JavaScript 来重构我的代码。
为简单起见,假设我有一个对象,如下所示:
export interface myObj {
name: string;
id: number;
description: string;
someBool: boolean;
anotherBool: boolean;
}
(导出界面有效,因为我在 Angular 中使用 Typescript 工作)。
这是旧的 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}
但这行不通。
const newObj = { ...oldObject, someBool: true, anotherBool: false};
编辑:
更新旧对象真的是您想做的吗?
在您的原始代码中,您将 oldObj 变异为函数的 side-effect。这通常被认为是不好的做法。下面是一个没有副作用的纯函数的例子。
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
}
}
如果要将解构后的值赋给 属性,可以通过在解构中 :
的 right-hand 侧指定 属性 来实现.
例如:下面将newObj.a
和newObj.c
分配给oldObj.a
和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);
正如 Bergi 在对该问题的评论中指出的那样,它并没有真正让你买多少
oldObj.a = newObj.a;
oldObj.c = newObj.c;
这就是各种 pick notations 流行起来的原因之一(最近才看到 activity)。如果该提案被接受(它甚至还没有冠军,所以不要屏住呼吸),你将有 oldObj.{a, c} = newObj;
.
TLDR: 如何使用解构加速一个对象基于同一接口的另一个对象的部分更新?
我想使用新的 ECMA2015 - 2017 JavaScript 来重构我的代码。
为简单起见,假设我有一个对象,如下所示:
export interface myObj {
name: string;
id: number;
description: string;
someBool: boolean;
anotherBool: boolean;
}
(导出界面有效,因为我在 Angular 中使用 Typescript 工作)。
这是旧的 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}
但这行不通。
const newObj = { ...oldObject, someBool: true, anotherBool: false};
编辑:
更新旧对象真的是您想做的吗?
在您的原始代码中,您将 oldObj 变异为函数的 side-effect。这通常被认为是不好的做法。下面是一个没有副作用的纯函数的例子。
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
}
}
如果要将解构后的值赋给 属性,可以通过在解构中 :
的 right-hand 侧指定 属性 来实现.
例如:下面将newObj.a
和newObj.c
分配给oldObj.a
和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);
正如 Bergi 在对该问题的评论中指出的那样,它并没有真正让你买多少
oldObj.a = newObj.a;
oldObj.c = newObj.c;
这就是各种 pick notations 流行起来的原因之一(最近才看到 activity)。如果该提案被接受(它甚至还没有冠军,所以不要屏住呼吸),你将有 oldObj.{a, c} = newObj;
.