답변:
필드 목록을 반복하지는 않지만 더 얇은 것이 있습니다. 매개 변수의 필요성을 피하기 위해 "매개 변수 파괴"를 사용합니다 v.
({id, title}) => ({id, title})
(이 다른 답변 의 실행 가능한 예제를 참조하십시오 ).
@EthanBrown의 솔루션이 더 일반적입니다. 다음은 Object.assign, 및 계산 된 속성 ( [p]부분) 을 사용하는보다 관용적 인 버전입니다 .
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
configurable열거 할 수없는 속성을 생략하면서 getter 및 setter와 같은 속성의 특성을 유지하려면 다음을 수행하십시오.
function pick(o, ...props) {
var has = p => o.propertyIsEnumerable(p),
get = p => Object.getOwnPropertyDescriptor(o, p);
return Object.defineProperties({},
Object.assign({}, ...props
.filter(prop => has(prop))
.map(prop => ({prop: get(props)})))
);
}
filter(...).map(prop => ({[prop]: get(prop)})))않습니까?
pick()구현 당신은 또한 같은 것을 할 수return props.reduce((r, prop) => (r[prop] = o[prop], r), {})
undefined있습니다. 때로는 중요합니다. 그 외에는 좋은 생각입니다.
나는 당신의 대답 (또는 torazburo)보다 훨씬 작게 만들 수있는 방법이 없다고 생각하지만 본질적으로 당신이하려는 것은 Underscore의 pick작업을 에뮬레이트하는 것입니다 . ES6에서 다시 구현하기가 충분히 쉽습니다.
function pick(o, ...fields) {
return fields.reduce((a, x) => {
if(o.hasOwnProperty(x)) a[x] = o[x];
return a;
}, {});
}
그런 다음 편리한 재사용 기능이 있습니다.
var stuff = { name: 'Thing', color: 'blue', age: 17 };
var picked = pick(stuff, 'name', 'age');
pick기능을 한 번만하면 원하는 많은 속성을 선택할 수 있으며 두 배가되지 않습니다.
hasOwnProperty합니까? 필드를 직접 선택하면 in더 적절한 것으로 보입니다. 확인을 완전히 생략하고 기본값을으로 설정했습니다 undefined.
이것을 하나의 라이너로 해결하는 요령은 취해진 접근법을 뒤집는 것입니다. 원래 객체에서 시작하는 대신 orig추출하려는 키에서 시작할 수 있습니다.
Array#reduce하나를 사용하면 각각의 필요한 키를 빈 initialValue함수 에 저장할 수 있습니다.이 객체는 for 함수 로 전달됩니다 .
이렇게 :
const orig = {
id: 123456789,
name: 'test',
description: '…',
url: 'https://…',
};
const filtered = ['id', 'name'].reduce((result, key) => { result[key] = orig[key]; return result; }, {});
console.log(filtered); // Object {id: 123456789, name: "test"}
쉼표 연산자를 사용하는 조금 더 짧은 솔루션 :
const pick = (O, ...K) => K.reduce((o, k) => (o[k]=O[k], o), {})
console.log(
pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
)
pick이 스레드 의 다른 기능 과 동일하게 작동 합니다.pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
TC39의 오브젝트 레스트 / 스프레드 속성 제안 은 이것을 매우 매끄럽게 만듭니다.
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
z; // { a: 3, b: 4 }
( 필요하지 않은 x및 y변수를 만드는 단점 이 있습니다.)
omit,하지만pick
let { a, b } as z = { x: 1, y: 2, a: 3, b: 4 }
객체 해체를 사용하여 기존 객체에서 속성을 언 패킹하고 이름이 다른 변수 ( 처음에는 비어있는 새 객체의 필드)에 변수를 할당 할 수 있습니다.
const person = {
fname: 'tom',
lname: 'jerry',
aage: 100,
}
let newPerson = {};
({fname: newPerson.fname, lname: newPerson.lname} = person);
console.log(newPerson);
현재 자바 스크립트의 객체 속기 구문을 개선 하기 위한 짚맨 제안 이 있는데 ,이를 반복하지 않고 명명 된 속성을 "선택"할 수 있습니다.
const source = {id: "68646", genre: "crime", title: "Scarface"};
const target = {};
Object.assign(target, {source.title, source.id});
console.log(picked);
// {id: "68646", title: "Scarface"}
안타깝게도이 제안은 언제 어디서나 진행되지 않는 것 같습니다. 2017 년 7 월에 마지막으로 편집되었으며 여전히 0 단계 에서 초안을 작성 하여 저자가 도둑질하거나 잊었을 수 있음을 나타냅니다.
내가 생각할 수있는 가장 간결한 속기 는 아무도 더 이상 사용하지 않는 고대 언어 기능 과 관련이 있습니다 .
Object.assign(target, {...(o => {
with(o) return { id, title };
})(source)});
with명령문은 엄격 모드에서 금지되므로이 방법은 최신 JavaScript의 99.999 %에 쓸모가 없습니다. 이 with기능에 대해 내가 찾은 유일한 중간 정도의 사용이기 때문에 부끄러운 일 입니다. 😀
Ethan Brown의 솔루션과 비슷하지만 pick기능이 짧습니다 . 다른 함수 pick2는 조금 길지만 느리지 만 ES6 방식과 비슷한 방식으로 속성 이름을 바꿀 수 있습니다.
const pick = (o, ...props) => props.reduce((r, p) => p in o ? {...r, [p]: o[p]} : r, {})
const pick2 = (o, ...props) => props.reduce((r, expr) => {
const [p, np] = expr.split(":").map( e => e.trim() )
return p in o ? {...r, [np || p]: o[p]} : r
}, {})
사용법 예는 다음과 같습니다.
const d = { a: "1", c: "2" }
console.log(pick(d, "a", "b", "c")) // -> { a: "1", c: "2" }
console.log(pick2(d, "a: x", "b: y", "c")) // -> { x: "1", c: "2" }
이 해결 방법이 필요했지만 제안 된 키가 있는지 알 수 없었습니다. 그래서 @torazaburo 답변을 받아 유스 케이스가 향상되었습니다.
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => {
if (o[prop]) return {[prop]: o[prop]};
}));
}
// Example:
var person = { name: 'John', age: 29 };
var myObj = pick(person, 'name', 'sex'); // { name: 'John' }
https://stackoverflow.com/users/865693/shesek 의 감소 접근 방식에서 영감을 얻었습니다 .
const pick = (orig, ...keys) => keys.reduce((acc, key) => ({...acc, [key]: orig[key]}), {})
용법:
pick({ model : 'F40', manufacturer: 'Ferrari', productionYear: 1987 }, 'model', 'productionYear')
결과 :
{model: "F40", productionYear: 1987}
Object.assign. es6는 선물이 너무 많은 크리스마스 트리와 같습니다. 휴가가 끝나고 몇 달이 지난 지금도 선물을 찾고 있습니다