Клонирование объекта js за исключением одного ключа


у меня есть плоский объект JS:

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

Я хочу, чтобы клонировать объект, за исключением одного элемента:

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

каков самый простой способ сделать это (предпочитая использовать es6/7, Если это возможно)?

10 123

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

демо в Babel REPL

источник:

для тех, кто не может использовать 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}

вы также можете использовать оператор spread для этого

const source = { a: 1, b: 2, c: 3, z: 26 }
const copy = { ...source, ...{ b: undefined } } // { a: 1, c: 3, z: 26 }