플랫 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};
출처:
답변
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
실제로 복사 할 수 없습니까?