克隆除一个键以外的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的人,可以使用lodash
或underscore
。
_.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}