[javascript] ES 6의 객체에서 일부 속성을 가져 오는 원 라이너

ES6에서 가장 작은 방식으로 속성을 거의 사용하지 않는 함수를 작성하는 방법은 무엇입니까?

destructuring + 단순화 된 객체 리터럴을 사용하여 솔루션을 생각해 냈지만 해당 필드 목록이 코드에서 반복되는 것을 좋아하지 않습니다.

더 얇은 솔루션이 있습니까?

(v) => {
    let { id, title } = v;
    return { id, title };
}



답변

필드 목록을 반복하지는 않지만 더 얇은 것이 있습니다. 매개 변수의 필요성을 피하기 위해 “매개 변수 파괴”를 사용합니다 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)})))
    );
}


답변

나는 당신의 대답 (또는 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');


답변

이것을 하나의 라이너로 해결하는 요령은 취해진 접근법을 뒤집는 것입니다. 원래 객체에서 시작하는 대신 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')
)  


답변

TC39의 오브젝트 레스트 / 스프레드 속성 제안 은 이것을 매우 매끄럽게 만듭니다.

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
z; // { a: 3, b: 4 }

( 필요하지 않은 xy변수를 만드는 단점 이 있습니다.)


답변

객체 해체를 사용하여 기존 객체에서 속성을 언 패킹하고 이름이 다른 변수 ( 처음에는 비어있는 새 객체의 필드)에 변수를 할당 할 수 있습니다.

const person = {
  fname: 'tom',
  lname: 'jerry',
  aage: 100,
}

let newPerson = {};

({fname: newPerson.fname, lname: newPerson.lname} = person);

console.log(newPerson);


답변

ES6은 질문이 작성된 당시의 최신 사양이었습니다. 이 답변 에서 설명한 것처럼 ES2019에서 ES6보다 키 선택이 상당히 짧습니다.

Object.fromEntries(
  Object.entries(obj)
  .filter(([key]) => ['foo', 'bar'].includes(key))
)