JavaScript - Как исключить элементы из объекта? - PullRequest
2 голосов
/ 16 марта 2020

У меня есть объект MainObject, но я хотел бы исключить и сопоставить некоторые ключи перед возвратом его пользователю. Однако я не знаю всех ключей, поскольку я использую оператор ...{}, чтобы позволить пользователю добавлять некоторые пользовательские данные в объект.

Мой код выглядит примерно так:

var UserData = {Id: 123, Name: "Hello World"}
var Data = {Main: "Data", Secret: "Data1", Math: 22, ...UserData}
// Resulting Object Keys [Main, Secret, Math, Id, Name]
// Wanted Object {Main, Math/2, Id, Name}
var result = ?

Что я хотел бы сделать, это исключить свойство Secret и разделить свойство Math на 2, сохраняя объект Data без изменений.

Ответы [ 5 ]

2 голосов
/ 16 марта 2020
const { Secret, ...result } = Data;

result.mathDivBy2 = function() { return this.Math/2; }

console.log(result);


Чтобы получить Math / 2, вы вызываете result.mathDivBy2();

Если вы хотите более удобный доступ, вместо функции вы можете определить геттер для result объекта:

Object.defineProperty(result, 'mathDivBy2', {
  get: function() { return this.Math/2; } 
});

и используйте его как любое другое свойство: result.mathDivBy2

1 голос
/ 16 марта 2020

Вы можете уничтожить ваш объект следующим образом и назначить Math / 2 после разрушения:

var UserData = { Id: 123, Name: "Hello World" };
var Data = { Main: "Data", Secret: "Data1", Math: 22, ...UserData };
var { Secret, ...result } = Data;
result.Math /= 2;
console.log(result);
1 голос
/ 16 марта 2020
  1. Чтобы удалить пару ключ-значение Secret, все, что вам нужно сделать, это сделать delete Data.Secret.
  2. Чтобы разделить Data.Math на 2, вы можете сделать Data.Math /= 2.

const UserData = {
  Id: 123,
  Name: "Hello World"
}
const Data = {
  Main: "Data",
  Secret: "Data1",
  Math: 22,
  ...UserData
}

// Delete `Data.Secret`
delete Data.Secret;

// Divide `Data.Math`
Data.Math /= 2;

console.log(Data);

Однако, если вы не очень уверены в том, что форма UserData подходит, и хотите убедиться, что разрешены только пары ключ-значение из белого списка, вам придется Определите разрешенные ключи, а затем переберите весь объект, чтобы удалить ненужные ключи:

const UserData = {
  Id: 123,
  Name: "Hello World"
}
const Data = {
  Main: "Data",
  Secret: "Data1",
  Math: 22,
  ...UserData
}

// Whitelist allowed object keys
const allowedKeys = ['Main', 'Math', 'Id', 'Name'];
Object.keys(Data).forEach(key => {
  if (!allowedKeys.includes(key))
    delete Data[key];
});

// Divide `Data.Math`
Data.Math /= 2;

console.log(Data);
0 голосов
/ 16 марта 2020

Так как вы хотите сохранить объект данных intact. Лучше сначала deep clone, а затем удалить ненужные ключи и обновить значение по мере необходимости.

var UserData = {Id: 123, Name: "Hello World"}
var Data = {Main: "Data", Secret: "Data1", Math: 22, ...UserData};
var result = JSON.parse(JSON.stringify(Data));
delete result["Secret"];
result["Math"] /= 2;

console.log(result);
//Data will remains as it is
console.log(Data);
0 голосов
/ 16 марта 2020

просто удали это ...

var UserData = {Id: 123, Name: "Hello World"}
var Data = {Main: "Data", Secret: "Data1", Math: 22, ...UserData}
var forexclude  = Object.assign({}, Data); //for cloning object
var excluded = delete forexclude.Secret; // for remove Secret

alert(JSON.stringify(forexclude, null, 4));
alert(JSON.stringify(excluded, null, 4));

// Resulting Object Keys [Main, Secret, Math, Id, Name]
// Wanted Object {Main, Math/2, Id, Name}
var result = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...