[javascript] 하나의 키를 제외하고 JavaScript 객체를 어떻게 복제 할 수 있습니까?

플랫 JS 객체가 있습니다.

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

하나의 요소를 제외하고 객체를 복제하고 싶습니다.

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

가장 쉬운 방법은 무엇입니까 (가능한 경우 es6 / 7을 사용하는 것이 바람직 함)?



답변

당신이 사용하는 경우 바벨을 당신은 다음 구문을 사용할 수있는 변수 Y에 속성의 휴식을 복사 한 후 변수 b에 X에서 속성 B를 복사 :

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


답변

Ilya Palkin의 답변에 추가하려면 키를 동적으로 제거 할 수도 있습니다.

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

바벨 REPL 데모

출처:


답변

ES6를 사용할 수없는 사람들은 lodash또는 을 사용할 수 있습니다 underscore.

_.omit(x, 'b')

또는 ramda.

R.omit('b', x)


답변

나는이 ESNext 하나의 라이너를 사용

const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = (({ b, c, ...o }) => o)(obj) // remove b and c
console.log(clone)


범용 기능이 필요한 경우 :

function omit(obj, props) {
  props = props instanceof Array ? props : [props]
  return eval(`(({${props.join(',')}, ...o}) => o)(obj)`)
}

// usage
const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = omit(obj, ['b', 'c'])
console.log(clone)


답변

간단한 도우미 함수를 작성할 수 있습니다. 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}

또한 Object.assign보다 빠르며 다음을 삭제하십시오. http://jsperf.com/omit-key


답변

아마도 이런 식으로 뭔가 :

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

이것으로 충분합니까? 아니면 c실제로 복사 할 수 없습니까?