Как получить свойство из объекта JavaScript, одновременно удаляя его - PullRequest
0 голосов
/ 26 мая 2020

У меня есть этот объект

firstObject = {
  'a': 1,
  'b': 2,
  'c': 3,
  'd': 4 
};

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

firstObject = {
  'a': 1,
  'c': 3
};
secondObject = {
  'b': 2,
  'd': 4 
};

Какой это правильный и более эффективный способ сделать это? Я видел такие вещи, но мне было интересно, есть ли какой-нибудь метод .pop(), например Array one , но для объектов.

secondObject['b'] = firstObject['b'];
secondObject['d'] = firstObject['d'];

delete firstObject['b'];
delete firstObject['d'];

Ответы [ 3 ]

3 голосов
/ 26 мая 2020

Один хитрый трюк для этого - использовать деструктуризацию:

const { b, d, ...rest } = firstObject;
Object.assign(secondObject, { b, d });
firstObject = rest;

По сути, ...rest в деструктурировании предназначен для создания объекта со всеми свойствами, не деструктурированными ранее.

0 голосов
/ 26 мая 2020

Можно сделать с помощью простого l oop и удалить.

firstObject = {
  'a': 1,
  'b': 2,
  'c': 3,
  'd': 4 
};

secondObject = {}

function copyToAndDelete(first, second, props) {
  props.forEach(function (key) {
    second[key] = first[key]
    delete first[key]
  })
}

copyToAndDelete(firstObject, secondObject, ["b", "d"])

console.log(firstObject)
console.log(secondObject)
0 голосов
/ 26 мая 2020

Я бы создал массив нужных вам свойств для одного из новых объектов, а затем использовал бы Object.fromEntries для создания нового объекта из этих ключей. Вы можете создать другой объект, .filter введя записи объекта в зависимости от того, существует ли в этом массиве повторяемый ключ:

const input = {
  'a': 1,
  'b': 2,
  'c': 3,
  'd': 4 
};
const props = ['a', 'c'];
const obj1 = Object.fromEntries(
  props.map(prop => [prop, input[prop]])
);
const obj2 = Object.fromEntries(
  Object.entries(input)
    .filter(([key]) => !props.includes(key))
);
console.log(obj1, obj2);
...