ES6 избавиться от остаточного разрушения объекта (обрезка объекта) - PullRequest
0 голосов
/ 29 марта 2020

Один хороший вариант использования функции деструктуризации при использовании с параметрами покоя заключается в том, что вы можете получить обрезанные клоны.

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;

Однако делать это с помощью деструктурирования кажется самым чистым способом, если вы клонируете объект со многими параметрами, и вам нужно исключить только пару.

Ответы [ 3 ]

2 голосов
/ 30 марта 2020

Введение _, __, ___ и т. Д. c для удаления 1,2,3 или более свойств не имеет большого значения, так как оно все еще создает переменные, которые '.. .вы никогда не захотите использовать ' и, более того, это грозит добавлением спагетти в ваш код.

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

  • фильтрацию нежелательных свойств

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

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 голосов
/ 29 марта 2020

Есть ли способ, которым я могу выбросить нежелательные артефакты / переменные деструктурирования?

Единственный способ, который также не слишком ужасен, - это определить функцию, которая делает то же самое :

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

const target = clone(source);

Переменные по-прежнему создаются, но их видимость ограничена функцией, которая немедленно завершается.

Однако выполнение этого с деструктуризацией кажется самым чистым способом, если вы Вы клонируете объект со многими параметрами, и вам нужно исключить только пару.

Недостаток описанного выше подхода заключается в том, что функция указывает c на указанный c объект. Вы не можете использовать его для других объектов. Конечно, он довольно маленький, так что, возможно, это не имеет большого значения. Но иметь более общую вспомогательную функцию c может быть проще для понимания.

0 голосов
/ 29 марта 2020

Используйте _, __, ___ или метод 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"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...