ES6处理剩余的对象破坏结构(对象修剪)

问题描述 投票:0回答:3

与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

但是,副作用是您的作用域现在被两个您永远不会使用的变量污染:unwanted1unwanted2

[如果_表示无关紧要,则可以执行以下操作

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;

但是,如果要克隆具有许多参数的对象,而只需要排除几个对象,那么执行解构似乎只是最干净的方法。

javascript ecmascript-6
3个回答
2
投票

引入______等来丢弃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 boost

const 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%;}

0
投票

使用______或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"]);

0
投票

有什么方法可以丢弃不需要的破坏产物/变量吗?

也不是太糟糕的唯一方法是定义一个执行相同功能的函数:

const clone = ({unwanted1, unwanted2, ...target}) => target;

const target = clone(source);

仍创建变量,但它们的可见性仅限于立即终止的函数。

但是,如果要克隆具有许多参数的对象,而只需要排除几个对象,那么执行解构似乎只是最干净的方法。

上述方法的缺点是该功能特定于特定对象。您不能将其重用于其他对象。当然,它很小,所以也许没什么大不了的。但是拥有更通用的辅助函数可能更容易理解。

© www.soinside.com 2019 - 2024. All rights reserved.