Клонирование объекта js за исключением одного ключа
у меня есть плоский объект JS:
{a: 1, b: 2, c: 3, ..., z:26}
Я хочу, чтобы клонировать объект, за исключением одного элемента:
{a: 1, c: 3, ..., z:26}
каков самый простой способ сделать это (предпочитая использовать es6/7, Если это возможно)?
10 ответов:
Если вы используете Бабель вы можете использовать следующий синтаксис для скопируйте свойство b из x в переменную b, а затем скопируйте остальные свойства в переменную y:
let x = {a: 1, b: 2, c: 3, z:26}; let {b, ...y} = x;
и он будет transpiled в:
"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 = x.b; 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});
чтобы добавить к ответу Ильи Палкина: вы даже можете динамически удалять ключи:
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};
источник:
для тех, кто не может использовать ES6, вы можете использовать
lodash
илиunderscore
._.omit(x, 'b')
или
ramda
.R.omit('b', x)
вы можете написать для него простую вспомогательную функцию. Lodash имеет аналогичную функцию с тем же именем: пропустить
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}
кроме того, обратите внимание, что это быстрее, чем объект.назначить и удалить затем:http://jsperf.com/omit-key
может, что-то вроде этого:
var copy = Object.assign({}, {a: 1, b: 2, c: 3}) delete copy.c;
это достаточно хорошо? Или не может
c
на самом деле копируются?
Эй, похоже, вы запускаете ссылки на проблемы, когда вы пытаетесь скопировать объект, а затем удалить свойство. Где-то вы должны назначить примитивные переменные, чтобы javascript сделал новое значение.
простой трюк (может быть ужасным) я использовал этот
var obj = {"key1":"value1","key2":"value2","key3":"value3"}; // assign it as a new variable for javascript to cache var copy = JSON.stringify(obj); // reconstitute as an object copy = JSON.parse(copy); // now you can safely run delete on the copy with completely new values delete copy.key2 console.log(obj) // output: {key1: "value1", key2: "value2", key3: "value3"} console.log(copy) // output: {key1: "value1", key3: "value3"}
Если вы имеете дело с огромным переменной, вы не хотите, чтобы скопировать его, а затем удалить его, так как это будет неэффективно.
простой for-loop с проверкой hasOwnProperty должен работать, и он гораздо более адаптируется к будущим потребностям:
for(var key in someObject) { if(someObject.hasOwnProperty(key) && key != 'undesiredkey') { copyOfObject[key] = someObject[key]; } }
Лодашь пропустить
let source = //{a: 1, b: 2, c: 3, ..., z:26} let copySansProperty = _.omit(source, 'b'); // {a: 1, c: 3, ..., z:26}