簡體   English   中英

使用解構賦值復制部分對象

[英]Partial object copying using Destructuring Assignment

有一個輸入對象需要復制到另一個對象是很常見的。 通常您需要復制一些屬性,最終得到一個非常相似的對象,但屬性較少。

此處的解構分配參考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring

假設你有這個輸入對象:

// an object with data
let oldObject = {
  a: 'this is a',
  b: 'this is b',
  c: 'this is c',
  d: 'this is d'
}

我是這樣做的:

let myNewObject = {
  a: oldObject.a,
  b: oldObject.b,
  c: oldObject.c
}

這是我一直在使用的一個:

// new version
let { a, b, c } = oldObject
let myNewObject = { a, b, c };

我開始使用的這個,似乎工作正常:

// newer version
let myNewObject = { a, b, c } = oldObject;

新版本的問題是我聲明了變量 a、b 和 c。 在這種情況下,沒有問題(幾乎),但是如果它們的名稱是inputoutputtempi或任何其他可能已經在作用域中聲明的變量的通用名稱呢?

所以解決方案很好,但更好的是這些變量是在該行中以某種方式創建和銷毀的,而在其他地方不可用。 myNewObject當然應該是可以訪問的。

我嘗試將它包裝在這樣的函數中,但根本沒有運氣:

let myNewObject = (function() { return { a, b, c } = oldObject })();

let myNewObject = (function() { let temp = { a, b, c } = oldObject; return temp; })();

所以我不確定實現這一目標的最佳方法是什么,我正在接近,但我錯過了一些東西。

新版本的問題是我聲明了變量 a、b 和 c。 在這種情況下沒有問題

有一個大問題。

let myNewObject = { a, b, c } = oldObject;

分配給現有的abc變量,這將在松散模式下污染全局范圍或在嚴格模式下導致錯誤。 myNewObject === oldObject 它的ES5 變體是:

var myNewObject = (a = oldObject.a, b = oldObject.b, c = oldObject.c, oldObject);

正如在這個答案中解釋的那樣,您正在尋找的單線是具有解構參數的 IIFE:

let myNewObject = (({ a, b, c }) => ({ a, b, c }))(oldObject);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM