【问题标题】:How to get a property from a JavaScript Object while removing it at the same time如何从 JavaScript 对象中获取属性同时删除它
【发布时间】:2020-09-13 14:02:29
【问题描述】:

我有这个对象

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

我想用它的一些值创建一个新对象,同时删除它们以供以后使用。

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

哪种方法更合适、更有效?我见过这样的事情,但我想知道是否有某种 .pop() 方法,如 the Array one 但用于对象。

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

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

【问题讨论】:

标签: javascript performance object javascript-objects


【解决方案1】:

这样做的一个偷偷摸摸的技巧是使用解构:

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

本质上,解构中的...rest 是用于创建一个具有之前未解构的所有属性的对象。

【讨论】:

  • 谢谢@Jacob!这回答了我的问题,代码很干净!
【解决方案2】:

我会为其中一个新对象创建一个包含您想要的属性的数组,然后使用Object.fromEntries 从这些键构造新对象。您可以通过 .filtering 对象的条目来创建另一个对象,方法是根据被迭代的键是否存在于该数组中:

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);

【讨论】:

  • 这比“获取然后删除”要多得多,而且要贵得多? (['b','d'].forEach(prop => { s[prop] = f[prop]; delete f[prop]; }) 会更有意义)
  • 如果一个人有任意数量的属性,那么能够在一个数组中列出一个对象想要的属性比在多行上重复它们要容易得多。 delete 还具有可怕的性能影响(尽管这很少是一个重大问题)并且通常是 IMO 的代码气味
【解决方案3】:

可以通过简单的循环和删除来完成。

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)

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 2010-09-17
    • 2016-09-27
    • 2011-05-09
    • 2011-01-16
    相关资源
    最近更新 更多