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


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.entriesArray.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.