자바 스크립트 객체 속성의 하위 집합을 얻는 방법


424

객체가 있다고 가정 해보십시오.

elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
};

속성의 하위 집합으로 새 객체를 만들고 싶습니다.

 // pseudo code
 subset = elmo.slice('color', 'height')

 //=> { color: 'red', height: 'unknown' }

어떻게하면 되나요?


2
Underscore 라이브러리에는 다음과 같은 많은 도우미 기능이 있습니다. underscorejs.org/#pick
— Stefan

4
나는 emo.slice언뜻보기에 그렇게 생각했다 .
— Bill Criswell

1
다시 생각하면 ... 하위 세트를 만들지 않을 것입니다.
— Andrew

답변:


673

객체 파괴 및 속성 속기 사용

const object = { a: 5, b: 6, c: 7  };
const picked = (({ a, c }) => ({ a, c }))(object);

console.log(picked); // { a: 5, c: 7 }


Philipp Kewisch에서 :

이것은 실제로 즉시 호출되는 익명 함수입니다. 이 모든 것은 MDN 의 Destructuring Assignment 페이지에서 찾을 수 있습니다 . 확장 된 형태는 다음과 같습니다

let unwrap = ({a, c}) => ({a, c});

let unwrap2 = function({a, c}) { return { a, c }; };

let picked = unwrap({ a: 5, b: 6, c: 7 });

let picked2 = unwrap2({a: 5, b: 6, c: 7})

console.log(picked)
console.log(picked2)


37
이 작업을 수행하는 방법에 대해 어떻게 알게 되었습니까? 내가 본 문서 나 기사 (MDN 포함)의 어느 곳에서도 Object Destructuring에 사용되는 화살표 구문을 보여주지 않습니다. 이것은 매우 기쁜 일입니다.
— papiro

52
이것은 실제로 즉시 호출되는 익명 함수입니다. 이 모든 것은 MDN의 Destructuring Assignment 페이지에서 찾을 수 있습니다. 다음은 확장 된 형태입니다. let unwrap = ({a, c}) => ({a, c}); let unwrap2 = function({a, c}) { return { a, c }; }; let picked = unwrap({ a: 5, b: 6, c: 7 });
— Philipp Kewisch

8
스프레드 연산자로 동적으로 수행하는 방법이 있습니까?
— Tom Sarduy 2016 년

4
@TomSarduy 제거 할 소품을 지정하려면 rest를 사용할 수 있습니다 (예 :로 const { b, ...picked } = object생성 picked) { a: 5, c: 7 }. 단순히 b를 제거하도록 지정했습니다. b. 당신의 eslint는 아마도 사용하지 않는 var를 선언 한 것에 대해 당신을 화나게 할 것입니다.
— Qaribou에서 Josh

24
여기서 단점은 일련의 속성 이름을 두 번 완전히 입력해야한다는 것입니다. 많은 속성을 선택해야하는 경우에는 상당히 문제가 될 수 있습니다.
— Gershom

144

Lodash를 살펴 보는 것이 좋습니다 . 많은 유용한 유틸리티 기능이 있습니다.

예를 들어 pick()원하는 것이 바로 다음과 같습니다.

var subset = _.pick(elmo, ['color', 'height']);

깡깡이


2
underscore.js와 동일
— Dan

1
선택하지 않고 특정 필드 만 제외하는 기능이 있습니까? 내 json에 약 50 개의 필드가 있으며 2 개의 필드를 제외한 모든 필드를 원합니다.
— Shrikant Prabhu

7
네! 당신이 사용할 수있는 _.omit(elmo, ['voice'])모든 것을 반환하지만voice
— xavdid

이 접근법에 대해 내가 싫어하는 것은 필드 이름을 따옴표로 묶는 것이므로 오타가 발생하기 쉽고 IDE에서 속성 이름을 바꾸는 것과 같은 일반적인 리팩토링은 선택하지 않습니다.
— Andy

117

ES6을 사용하는 경우에는 구조화를 사용하여이 작업을 수행하는 매우 간결한 방법이 있습니다. Destructuring을 사용하면 스프레드를 사용하여 객체를 쉽게 추가 할 수 있지만 동일한 방식으로 하위 세트 객체를 만들 수도 있습니다.

const object = {
  a: 'a',
  b: 'b',
  c: 'c',
  d: 'd',
}

// Remove "c" and "d" fields from original object:
const {c, d, ...partialObject} = object;
const subset = {c, d};

console.log(partialObject) // => { a: 'a', b: 'b'}
console.log(subset) // => { c: 'c', d: 'd'};

6
이것은 알려진 부분 집합을 선택하지 않고 필드를 제거하는 것만 작동합니까? 알 수없는 필드를 무한정 제거 할 수 있지만 일부 사람들이 찾고있는 것일 수도 있습니다.
— Alexander Mills

사실이지만 몇 가지 알려진 필드를 제거한 다음 새 개체에 다시 할당하여 여전히이 질문과 관련이 있다고 생각할 수 있습니다. 추가 설명을 위해 답변에 추가되었습니다.
— Lauren

1
이것은 @Ivan Nosov의 답변 과 본질적으로 동일 하지만 여기서는 더 이해하기 쉬운 방식으로 설명되어 있지만
— icc97

81

좀 더 장황하지만 Array.prototype.reduce 를 사용하여 2 년 전 다른 사람들이 밑줄 / 로다시를 추천 한 것을 달성 할 수 있습니다 .

var subset = ['color', 'height'].reduce(function(o, k) { o[k] = elmo[k]; return o; }, {});

이 접근법은 반대편에서 그것을 해결합니다. 객체를 가져 와서 속성 이름을 전달하여 추출하고 속성 이름 배열을 가져 와서 새 객체로 줄이십시오.

가장 간단한 경우에 더 장황하지만, 여기의 콜백은 몇 가지 일반적인 요구 사항을 쉽게 충족시킬 수 있기 때문에 매우 편리합니다. 예를 들어 새 객체에서 'color'속성을 'color'로 변경하거나 배열을 평평하게하는 등 하나의 서비스 / 라이브러리에서 오브젝트를 수신하고 다른 곳에 필요한 새 오브젝트를 빌드 할 때 수행해야하는 작업. 밑줄 / 로대시는 우수하고 잘 구현 된 라이브러리이지만, 이것은 공급 업체 의존도를 낮추기 위해 선호하는 방법이며, 하위 집합 작성 논리가 복잡해지면 더 단순하고 일관된 방법입니다.

편집 : 같은 es7 버전 :

const subset = ['color', 'height'].reduce((a, e) => (a[e] = elmo[e], a), {});

편집 : 카레에 대한 좋은 예! 'pick'함수가 다른 함수를 반환하도록합니다.

const pick = (...props) => o => props.reduce((a, e) => ({ ...a, [e]: o[e] }), {});

위의 방법은 다른 방법과 거의 비슷하지만 즉시 '피커'를 만들 수 있습니다. 예 :

pick('color', 'height')(elmo);

이 접근 방식에서 특히 좋은 점은 선택한 '선택'을 기능을 수행하는 모든 항목에 쉽게 전달할 수 있다는 것입니다 Array#map.

[elmo, grover, bigBird].map(pick('color', 'height'));
// [
//   { color: 'red', height: 'short' },
//   { color: 'blue', height: 'medium' },
//   { color: 'yellow', height: 'tall' },
// ]

3
es6을 사용하면 화살표 기능을 통해이 객체를 더 깨끗하게 만들 수 있으며 Object.assign의 반환 값 (객체 속성에 할당하면 속성 값이 반환되지만 Object.assign은 객체를 반환하므로)
— Josh at Qaribou

또 다른 es6 참고 사항 : 일반적으로 할당 또는 인수를 구조화하기 때문에 더 이상이 작업을 거의 수행하지 않아도됩니다. 예를 들어 function showToy({ color, height }) {필요한 것만 범위에 넣을 수 있습니다. 이 reduce방법은 직렬화를 위해 객체를 단순화 할 때 주로 적합합니다.
— Qaribou에서 Josh

6
ES6 버전은 각 반복마다 모든 특성의 사본을 작성하므로 성능이 떨어집니다. O (n) 연산을 O (n ^ 2)로 만듭니다. 첫 번째 코드 블록과 동등한 ES6는const pick = (obj, props) => props.reduce((a, e) => (a[e] = obj[e], a), {});
— 4castle

@ 4castle yep 좋은 전화-너무 많은 반복 감각이 없습니다. 나는 쉼표 구문을 좋아합니다-많은 수익보다 낫습니다.
— Qaribou에서 Josh

1
@ShevchenkoViktor 나는 원래 es6 버전에서 실제로 그 접근 방식을 사용했지만 @ 4castle의 의견에 따라 변경했습니다. 스프레드가 더 명확하다고 생각하지만 병목 현상이 발생하기 쉬운 코드의 큰 객체 (예 :에서 반환 된 렌더링 데이터 지연)에 큰 차이가 fetch있으므로 쉼표 연산자 사용을 설명하는 주석을 추가하는 것이 좋습니다.
— Qaribou에서 조쉬

45

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.includesECMAScript를 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 }

11
이 답변이 너무 최근에 너무나 부끄러워서 그럴만 한 가치가있는 것은 아닙니다. IMO는 완전성, 단순성, 다목적 성 및 공정성에 대한 인정 된 답변이어야합니다. ES6 버전을 가장 유용한 스 니펫 라이브러리에 보관하겠습니다.
— VanAlbert

— ES5-

@NikhilVartak obj변수는 객체를 저장하는 변수 일 것으로 예상 됩니다. 변수 이름이 다른 경우 대신 대신 사용하십시오 obj.
— Estus Flask

내 잘못이야! 나는 간과했다 Object.keys(obj). 졸리는.
— Nikhil Vartak

34

핵심 라이브러리에 내장 된 것과 같은 것은 없지만 객체 파괴를 사용하여 수행 할 수 있습니다 ...

const {color, height} = sourceObject;
const newObject = {color, height};

유틸리티 함수를 작성할 수도 있습니다 ...

const cloneAndPluck = function(sourceObject, keys) {
    const newObject = {};
    keys.forEach((obj, key) => { newObject[key] = sourceObject[key]; });
    return newObject;
};

const subset = cloneAndPluck(elmo, ["color", "height"]);

Lodash와 같은 라이브러리도 있습니다 _.pick().


1
위대한, 나는 forEach를 다음과 같이 변경해야했다 : keys.forEach (key => {newObject [key] = sourceObject [key];}) ;. 이것이 의미가 있다면 의견을 업데이트하십시오.
— 칸단

34

사용 된 답변이 없기 때문에이 답변을 추가하고 Comma operator있습니다.

그것은 매우 쉽게 destructuring assignment및 ,연산자

const object = { a: 5, b: 6, c: 7  };
const picked = ({a,c} = object, {a,c})

console.log(picked);

동적 속성 할당이 향상되면 다음과 같이 보일 수 있습니다.


2
내 나쁜, 나는 그것이 작동하지 전에 내가 무슨 짓을했는지 모르겠지만 작동하는 것 같습니다
— ekkis

1
그것이 파괴에 관한 최고의 표현입니다
— Mohamed Allal

1
이 솔루션은 영리하지만 엄격 모드 (예 :)에서는 작동하지 않습니다 'use strict'. 나는을 얻는다 ReferenceError: a is not defined.
— kimbaudi

8
이 방법은 두 변수와 현재 범위 오염주의 a하고 c있지 문맥에 따라 무작위로 덮어 쓰기 로컬 또는 글로벌 바르에주의가 -. (허용 된 답변은 즉시 실행 후 범위를 벗어난 인라인 함수에 두 개의 로컬 변수를 사용하여이 문제를 방지합니다.)
— mindplay.dk

2
네임 스페이스 오염은이를 완전히 비현실적으로 만듭니다. 스코프에 객체 속성과 일치하는 변수가 이미있는 경우가 매우 흔하기 때문에 prop shortshort + destructuring이 존재합니다. 원래 예제에서와 같이 높이 또는 색상이 이미 정의되어있을 것입니다.
— Qaribou의 Josh

23

하나 더 해결책 :

var subset = {
   color: elmo.color,
   height: elmo.height 
}

이것은 지금까지 거의 모든 대답보다 훨씬 더 읽기 쉬워 보이지만 어쩌면 그것은 저뿐입니다!


9
나는 화려하지만 혼란스러운 코드보다 생산적인 것을 선호하며 실제 소프트웨어 엔지니어링에서 이것은 가장 읽기 쉽고 유지 관리가 쉬운 솔루션입니다.
— Janos

1
그러나 나에게, 파괴 및 속기 표기법을 사용하는 것의 한 가지 단점은 오류가 덜 발생한다는 것입니다. 내가 코드를 잘못 복사하여 붙여 넣을 때마다 1 페니를 먹었 subset = {color: elmo.color, height: elmo.color}다면 적어도 ... 음, 한푼도 있었을 것입니다.
— JHH

나는 건조하지 않기 때문에
— 구조적

동의해야합니다. 원치 않는 변수로 컨텍스트를 오염시키지 않으면 서 가장 읽기 쉬운 솔루션입니다. 나머지는 너무 혼란스럽게 보입니다. 두 번째로 보는 코드를 이해하는 것을 선호합니다.
— 앤드류

11

Lodash 를 사용할 수도 있습니다.

var subset = _.pick(elmo ,'color', 'height');

보완하면서 "elmo"배열이 있다고 가정 해 봅시다.

elmos = [{ 
      color: 'red',
      annoying: true,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    },{ 
      color: 'blue',
      annoying: true,
      height: 'known',
      meta: { one: '1', two: '2'}
    },{ 
      color: 'yellow',
      annoying: false,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    }
];

lodash를 사용하여 동일한 동작을 원하면 다음을 수행하십시오.

var subsets = _.map(elmos, function(elm) { return _.pick(elm, 'color', 'height'); });

10

이 질문 에서 논의한 바와 같이 JavaScript에서 동적으로 명명 된 변수를 파기하는 것은 불가능 합니다.

키를 동적으로 설정 하려면 다음과 같이 객체를 변경하지 않고 축소 기능을 사용할 수 있습니다.

const getSubset = (obj, ...keys) => keys.reduce((a, c) => ({ ...a, [c]: obj[c] }), {});

const elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

const subset = getSubset(elmo, 'color', 'annoying')
console.log(subset)

단일 복제본을 업데이트하는 대신 모든 반복에서 새 객체를 생성하고 있습니다. – mpen

아래는 단일 복제본으로 reduce를 사용하는 버전입니다 (감소하기 위해 전달 된 초기 값 업데이트).

const getSubset = (obj, ...keys) => keys.reduce((acc, curr) => {
  acc[curr] = obj[curr]
  return acc
}, {})

const elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

const subset = getSubset(elmo, 'annoying', 'height', 'meta')
console.log(subset)


1
대박! 그것은 대괄호가 얼마나 중요한지 깨닫지 못하고 잠시 나에게 던져졌다. 나는 그것이 어떻게 든 c를 속성 이름 대신 값으로 보도록한다고 가정합니다. 어쨌든 매우 시원합니다. +1
— John Fairbanks

고마워 친구! 그 사용법은 eval을 사용하지 않고 일반적인 기능을 가능하게하는 JavaScript에 대해 좋아하는 것입니다. 간단히 말해 런타임에 dict 키를 변수로 설정할 수 있습니다. var key = 'someKey'를 정의하면이를 {[key] : 'value'}로 사용할 수 있으며 {someKey : 'value'}가됩니다. 정말 멋진.
— Muhammet Enginar

1
단일 복제본을 업데이트하는 대신 모든 반복에서 새 객체를 생성하고 있습니다.
— mpen

1
@mpen 좋은 찾기. 키 배열을 전달하는 대신 args를 분산시키는 것이 좋습니다 제안 단일 복제 버전을 추가했습니다.
— Muhammet Enginar '

7

TypeScript 솔루션 :

export function pick<T extends object, U extends keyof T>(obj: T, paths: Array<U>) {
    return paths.reduce((o, k) => {
        o[k] = obj[k];
        return o;
    }, Object.create(null));
}

타이핑 정보는 자동 완성을 허용합니다.

속임수를 위한 DefinitelyTyped의 크레딧U extends keyof T


나를 위해 작동하지 않습니다.
— Nuthinking

@Nuthinking VS 코드를 사용하고 있습니까?
— mpen

예, VS 코드를 사용합니다.
— Nuthinking

@Nuthinking 그리고 .ts 파일에 넣었습니까? 작동합니다. 방금 다시 시도했습니다
— mpen


4

다이나믹 솔루션

['color', 'height'].reduce((a,b) => (a[b]=elmo[b],a), {})


3

또 다른 방법은 ...

var elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

var subset = [elmo].map(x => ({
  color: x.color,
  height: x.height
}))[0]

이 함수는 Objects =) 배열과 함께 사용할 수 있습니다


2

어때요 :

function sliceObj(obj) {
  var o = {}
    , keys = [].slice.call(arguments, 1);
  for (var i=0; i<keys.length; i++) {
    if (keys[i] in obj) o[keys[i]] = obj[keys[i]];
  }
  return o;
}

var subset = sliceObj(elmo, 'color', 'height');

속성 값이 false틀리면 실패합니다 . jsfiddle.net/nfAs8
— Alxandr

그래서 내가로 변경했습니다 keys[i] in obj.
— elclanrs

2

이것은 Chrome 콘솔에서 작동합니다. 이것에 문제가 있습니까?

var { color, height } = elmo
var subelmo = { color, height }
console.log(subelmo) // {color: "red", height: "unknown"}

4
이것은 잘 읽지 만 색상과 높이라는 두 가지 불필요한 변수를 만듭니다.
— user424174

당신의 의견을 이해하지 마십시오. OP의 요구 사항은이 두 가지 요소를 가진 개체를 만드는 것이 었습니다
— MSi

@MSi 이것은 하나의 객체를 생성 할뿐만 아니라 두 개의 변수를 생성합니다.
— 디자인 : Adrian

1

동적 속성으로 할당 해체

이 솔루션은 특정 예에만 적용되는 것이 아니라보다 일반적으로 적용 할 수 있습니다.

const subset2 = (x, y) => ({[x]:a, [y]:b}) => ({[x]:a, [y]:b});

const subset3 = (x, y, z) => ({[x]:a, [y]:b, [z]:c}) => ({[x]:a, [y]:b, [z]:c});

// const subset4...etc.


const o = {a:1, b:2, c:3, d:4, e:5};


const pickBD = subset2("b", "d");
const pickACE = subset3("a", "c", "e");


console.log(
  pickBD(o), // {b:2, d:4}
  pickACE(o) // {a:1, c:3, e:5}
);

subset4더 많은 속성을 고려하기 위해 등을 쉽게 정의 할 수 있습니다 .


1

좋은 Array.prototype.reduce:

const selectable = {a: null, b: null};
const v = {a: true, b: 'yes', c: 4};

const r = Object.keys(selectable).reduce((a, b) => {
  return (a[b] = v[b]), a;
}, {});

console.log(r);

이 응답은 또한, 마법 콤마 연산자를 사용 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

정말로 화려하고 싶다면 더 컴팩트합니다.

const r = Object.keys(selectable).reduce((a, b) => (a[b] = v[b], a), {});

재사용 가능한 함수로 통합

const getSelectable = function (selectable, original) {
  return Object.keys(selectable).reduce((a, b) => (a[b] = original[b], a), {})
};

const r = getSelectable(selectable, v);
console.log(r);

1
  1. 인수를 배열로 변환

  2. Array.forEach()재산을 고르기 위해 사용 하십시오

    Object.prototype.pick = function(...args) {
       var obj = {};
       args.forEach(k => obj[k] = this[k])
       return obj
    }
    var a = {0:"a",1:"b",2:"c"}
    var b = a.pick('1','2')  //output will be {1: "b", 2: "c"}

4
기본 유형의 프로토 타입을 확장하는 것은 좋지 않지만 나쁜 습관으로 간주됩니다. 라이브러리를 작성하는 경우이 작업을 수행하지 마십시오.
— Emile Bergeron

0
function splice()
{
    var ret = new Object();

    for(i = 1; i < arguments.length; i++)
        ret[arguments[i]] = arguments[0][arguments[i]];

    return ret;
}

var answer = splice(elmo, "color", "height");

0

시험

const elmo={color:"red",annoying:!0,height:"unknown",meta:{one:"1",two:"2"}};

const {color, height} = elmo; newObject = ({color, height});

console.log(newObject); //{ color: 'red', height: 'unknown' }

0

Ivan Nosov 답변에 내 2 센트 추가 :

필자의 경우 객체에서 '슬라이스'하기 위해 많은 키가 필요했기 때문에 매우 역동적 인 솔루션이 아닌 추악하고 빠릅니다.

const object = { a: 5, b: 6, c: 7, d: 8, aa: 5, bb: 6, cc: 7, dd: 8, aaa: 5, bbb: 6, ccc: 7, ddd: 8, ab: 5, bc: 6, cd: 7, de: 8  };
const picked = (({ a, aa, aaa, ab, c, cc, ccc, cd }) => ({ a, aa, aaa, ab, c, cc, ccc, cd }))(object);

console.log(picked);

eval을 사용하는 동적 솔루션은 다음과 같습니다.

const slice = (k, o) => eval(`(${k} => ${k})(o)`);


const object    = { a: 5, b: 6, c: 7, d: 8, aa: 5, bb: 6, cc: 7, dd: 8, aaa: 5, bbb: 6, ccc: 7, ddd: 8, ab: 5, bc: 6, cd: 7, de: 8  };
const sliceKeys = '({ a, aa, aaa, ab, c, cc, ccc, cd })';

console.log( slice(sliceKeys, object) );

-2

참고 : 원래 질문은 자바 스크립트에 대한 것이지만 아래 솔루션으로 jQuery를 수행 할 수 있습니다.

원하는 경우 하나의 슬라이스에 대한 샘플 코드가 jquery를 확장 할 수 있습니다.

jQuery.extend({
  sliceMe: function(obj, str) {
      var returnJsonObj = null;
    $.each( obj, function(name, value){
        alert("name: "+name+", value: "+value);
        if(name==str){
            returnJsonObj = JSON.stringify("{"+name+":"+value+"}");
        }

    });
      return returnJsonObj;
  }
});

var elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
};


var temp = $.sliceMe(elmo,"color");
alert(JSON.stringify(temp));

여기에 같은 바이올린이 있습니다 : http://jsfiddle.net/w633z/


16
jquery 란 무엇입니까?
— Christian Schlensker

1
@ChristianSchlensker 그것은 자바 스크립트입니다
— Kevin B
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.