与rest参数一起使用时,解构功能的一个很好的用例是,您可以获得修剪后的克隆。
var source = { w1: 'val1', w2: 'val2', unwanted1: 'val3', unwanted2: 'val4'};
var {unwanted1, unwanted2, ...target} = source;
console.log(target); // `{ w1: 'val1', w2: 'val2' }` Exactly what you want
但是,副作用是您的作用域现在被两个您永远不会使用的变量污染:unwanted1
和unwanted2
。
[如果_
表示无关紧要,则可以执行以下操作
var {
unwanted1:_, // throw away
unwanted2:_, // throw away
target
} = source;
但是,在Javascript中_
是适当的标识符。如果以这种方式(unwanted: _
)一次使用,您将得到一个名为_
的不需要的变量,这违背了目标。如果多次使用(如上),则会发出错误:
SyntaxError: Identifier '_' has already been declared
。
有什么方法可以丢弃不需要的破坏产物/变量吗?
当然,以下解决方案始终可用。
var target = {
w1: source.w1,
w2: source.w2,
}
和
var target = {...source};
delete target.unwanted1;
delete target.unwanted2;
但是,如果要克隆具有许多参数的对象,而只需要排除几个对象,那么执行解构似乎只是最干净的方法。
引入_
,__
,___
等来丢弃1,2,3或更多属性并没有多大区别,因为它仍会创建变量,而'...您将永远不在乎使用”,而且有可能在您的代码中添加意粉的味道。
但是,由于您需要明确指出要删除的属性,因此可以考虑使用其他object trimming技术,例如
const obj = {prop1: 1, prop2:2, prop3: 3, prop4: 4, prop5: 5},
keysToDrop = ['prop2', 'prop3', 'prop4'],
trimmedObj = Object.fromEntries(
Object
.entries(obj)
.filter(([key,val]) => !keysToDrop.includes(key)
)
)
console.log(trimmedObj)
.as-console-wrapper{min-height:100%;}
Array.prototype.reduce()
,甚至可以给您某些performance boostconst obj = {prop1: 1, prop2:2, prop3: 3, prop4: 4, prop5: 5},
keysToDrop = ['prop2', 'prop3', 'prop4'],
trimmedObj = Object
.keys(obj)
.reduce((r,key) =>
(!keysToDrop.includes(key) && (r[key] = obj[key]), r),{})
console.log(trimmedObj)
.as-console-wrapper{min-height:100%;}
使用_
,__
,___
或Just方法排除::D哈哈
function prop(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
var source = {
w1: "val1",
w2: "val2",
unwanted1: "val3",
unwanted2: "val4"
};
var target = prop(source, ["unwanted1", "unwanted2"]);
有什么方法可以丢弃不需要的破坏产物/变量吗?
也不是太糟糕的唯一方法是定义一个执行相同功能的函数:
const clone = ({unwanted1, unwanted2, ...target}) => target;
const target = clone(source);
仍创建变量,但它们的可见性仅限于立即终止的函数。
但是,如果要克隆具有许多参数的对象,而只需要排除几个对象,那么执行解构似乎只是最干净的方法。
上述方法的缺点是该功能特定于特定对象。您不能将其重用于其他对象。当然,它很小,所以也许没什么大不了的。但是拥有更通用的辅助函数可能更容易理解。