Частичное копирование объекта с использованием Destructuring Assignment - PullRequest
0 голосов
/ 04 сентября 2018

Очень часто есть входной объект, который вам нужно скопировать в другой объект. Часто вам нужно скопировать некоторые свойства, и в результате вы получите очень похожий объект, но с меньшим количеством свойств.

Ссылка для деструктурирующего назначения здесь 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. В этом случае нет проблем ( почти ), но что делать, если их имена input, output, temp, i или любое другое общее имя для переменных, которые могли быть уже заявлено в объеме.

Так что решение великолепно, но было бы еще лучше, если бы эти переменные каким-то образом создавались и уничтожались в этой строке и не были доступны в другом месте. myNewObject должен быть доступен конечно.

Я пытался обернуть его в такую ​​функцию, но не повезло вообще:

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

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

Так что я не уверен, каков наилучший способ достичь этого, я уже близко, но что-то упускаю.

1 Ответ

0 голосов
/ 04 сентября 2018

Проблема с более новыми версиями заключается в том, что я объявляю переменные a, b и c. В этом случае нет проблем

Существует большая проблема.

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

присваивает существующим переменным a, b и c, это загрязнит глобальную область действия в свободном режиме или приведет к ошибке в строгом режиме. Пока 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);
...