ES6 파괴
구조화 구문을 사용하면 함수 매개 변수 또는 변수를 사용하여 오브젝트를 구조화하고 재결합 할 수 있습니다.
제한 사항은 키 목록이 미리 정의되어 있으며 질문에서 언급했듯이 문자열로 나열 할 수 없다는 것입니다. 키가 영숫자가 아닌 경우 구조화가 더 복잡해집니다 (예 :) foo_bar
.
단점은 키 목록을 복제해야하므로 목록이 긴 경우 자세한 코드가 생성된다는 것입니다. 이 경우에 구조를 제거하면 객체 리터럴 구문이 복제되므로 목록을 그대로 복사하여 붙여 넣을 수 있습니다.
단점은 ES6에 자연스러운 성능 솔루션이라는 것입니다.
IIFE
let subset = (({ foo, bar }) => ({ foo, bar }))(obj); // dupe ({ foo, bar })
임시 변수
let { foo, bar } = obj;
let subset = { foo, bar }; // dupe { foo, bar }
문자열 목록
선택된 키의 임의 목록은 질문에 따라 문자열로 구성됩니다. 이를 통해 사전 정의 할 수 없으며 키 이름이 포함 된 변수를 사용할 수 있습니다 pick(obj, 'foo', someKey, ...moreKeys)
.
각 JS 버전마다 하나의 라이너가 짧아집니다.
ES5
var subset = Object.keys(obj)
.filter(function (key) {
return ['foo', 'bar'].indexOf(key) >= 0;
})
.reduce(function (obj2, key) {
obj2[key] = obj[key];
return obj2;
}, {});
ES6
let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => Object.assign(obj2, { [key]: obj[key] }), {});
또는 쉼표 연산자로 :
let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => (obj2[key] = obj[key], obj2), {});
ES2019
ECMAScript를 2017가 Object.entries
와 Array.prototype.includes
ECMAScript를 2019가 있으며, Object.fromEntries
필요하고 쉽게 작업을 할 때, 그들은 polyfilled 할 수 있습니다 :
let subset = Object.fromEntries(
Object.entries(obj)
.filter(([key]) => ['foo', 'bar'].includes(key))
)
하나의 라이너는 Lodashpick
와 유사 하거나 omit
키 목록이 인수를 통해 전달 되는 도우미 함수로 다시 작성 될 수 있습니다 .
let pick = (obj, ...keys) => Object.fromEntries(
Object.entries(obj)
.filter(([key]) => keys.includes(key))
);
let subset = pick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1 }
누락 된 키에 대한 참고 사항
디스트 럭처링과 기존 Lodash와 유사한 pick
기능 의 주요 차이점은 디스트 럭처링 에는 존재하지 않는 선택된 키가 undefined
하위 집합에 값을 포함한다는 것입니다.
(({ foo, bar }) => ({ foo, bar }))({ foo: 1 }) // { foo: 1, bar: undefined }
이 동작은 바람직하거나 바람직하지 않을 수 있습니다. 구문을 파괴하기 위해 변경할 수 없습니다.
하지만 pick
대신 집어 키의 목록을 반복하여 키 누락 포함하도록 변경 될 수있다 :
let inclusivePick = (obj, ...keys) => Object.fromEntries(
keys.map(key => [key, obj[key]])
);
let subset = inclusivePick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1, bar: undefined }