克隆除一个键以外的js对象

我有一个平坦的JS对象:

{a: 1, b: 2, c: 3, ..., z:26} 

我想克隆除了一个元素的对象:

 {a: 1, c: 3, ..., z:26} 

最简单的方法是什么(如果可能的话,宁愿使用es6 / 7)?

如果使用Babel ,则可以使用以下语法将属性b从x复制到variablesb中,然后将其余属性复制到variablesy中

 let x = {a: 1, b: 2, c: 3, z:26}; let {b, ...y} = x; 

它将被转换成:

 "use strict"; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } var x = { a: 1, b: 2, c: 3, z: 26 }; var b = xb; var y = _objectWithoutProperties(x, ["b"]); 
 var clone = Object.assign({}, {a: 1, b: 2, c: 3}); delete clone.b; 

或者如果你接受属性是未定义的:

 var clone = Object.assign({}, {a: 1, b: 2, c: 3}, {b: undefined}); 

要添加到Ilya Palkin的答案:你甚至可以dynamic删除键:

 const x = {a: 1, b: 2, c: 3, z:26}; const objectWithoutKey = (object, key) => { const {[key]: deletedKey, ...otherKeys} = object; return otherKeys; } console.log(objectWithoutKey(x, 'b')); // {a: 1, c: 3, z:26} console.log(x); // {a: 1, b: 2, c: 3, z:26}; 

在Babel REPL演示

资源:

对于那些不能使用ES6的人,可以使用lodashunderscore

 _.omit(x, 'b') 

或者ramda

 R.omit('b', x) 

你可以为它写一个简单的帮助函数。 Lodash具有相同的名称: omit

 function omit(obj, omitKey) { return Object.keys(obj).reduce((result, key) => { if(key !== omitKey) { result[key] = obj[key]; } return result; }, {}); } omit({a: 1, b: 2, c: 3}, 'c') // {a: 1, b: 2} 

另外请注意,它比Object.assign更快,然后删除: http : //jsperf.com/omit-key

也许这样的事情:

 var copy = Object.assign({}, {a: 1, b: 2, c: 3}) delete copy.c; 

这足够好吗? 还是不能c实际上被抄袭?

如果你正在处理一个巨大的variables,你不想复制它,然后删除它,因为这将是低效的。

具有hasOwnProperty检查的简单for循环应该可以工作,并且对未来的需求更加适应:

 for(var key in someObject) { if(someObject.hasOwnProperty(key) && key != 'undesiredkey') { copyOfObject[key] = someObject[key]; } } 

Lodash 省略

 let source = //{a: 1, b: 2, c: 3, ..., z:26} let copySansProperty = _.omit(source, 'b'); // {a: 1, c: 3, ..., z:26}