lodash를 사용하여 객체를 배열로 변환


165

lodash로 어떻게 큰 object것을 array바꿀 수 있습니까?

var obj = {
  22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
  12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}

// transform to 
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]

@Mritunjay 문서가 라이브러리에 대한 훌륭한 개요를 가지고 있기 때문에 그렇습니다. 그것은 철저한 기능 목록이며 각 기능을 수행하지 않으면 시간 낭비가 될 수 있습니다. 문제는 공정한 것입니다.
Epirocks

답변:


264

넌 할 수있어

var arr = _.values(obj);

설명서는 여기를 참조 하십시오.


34
키를 속성으로 유지하려면 어떻게해야합니까? (이 예에서, id속성이 존재하지 않고 각 객체의 키를 기준으로 속성을 생성하려는 경우
Michael Liquori

8
다음과 같은 작업을 수행 할 수 있습니다.var arr = _.values(_.mapKeys(obj, function(value, key) { value.id = key; return value; }));
Daniel Schmidt

1
@DanielSchmidt 내가 잘못한 것이 확실하지 않지만 그 샘플은 나에게 1 행만 반환했습니다. :( 그래서 내가 한 일은 수동으로 return값을 다음과 같은 배열로 푸시하는 const divisionsList = []; _.mapKeys(divisions, (value, key) => { divisionsList[key] = value; });것입니다.이 접근법을 개선하기위한 의견이나 제안에 감사드립니다.
JohnnyQ

8
@JohnnyQ 난 당신이 대신 예를 들어 mapValues 사용해야합니다 생각const toArrayWithKey = (obj, keyAs) => _.values(_.mapValues(obj, (value, key) => { value[keyAs] = key; return value; }));
orjan

1
@ orjan 예, 실제로 이것을 알아 냈습니다. 업데이트를 잊어 버렸습니다. 고마워
JohnnyQ

38
_.toArray(obj);

다음과 같이 출력됩니다 :

[
  {
    "name": "Ivan",
    "id": 12,
    "friends": [
      2,
      44,
      12
    ],
    "works": {
      "books": [],
      "films": []
    }
  },
  {
    "name": "John",
    "id": 22,
    "friends": [
      5,
      31,
      55
    ],
    "works": {
      "books": [],
      "films": []
    }
  }
]"

1
_.toArray () 작동 @jivings
Syed Zain Ali

4
값만 얻는 것이 좋은 옵션이지만 toArray필요한 경우 키를 보존 할 방법이 없습니다.
Koushik Chatterjee

33

누군가 관심이 있다면 현대적인 기본 솔루션 :

const arr = Object.keys(obj).map(key => ({ key, value: obj[key] }));

또는 (IE가 아님) :

const arr = Object.entries(obj).map(([key, value]) => ({ key, value }));

2
왜 그렇게Object.keys(obj).map(key=>({key,value: obj[key]}))
Koushik Chatterjee

1
나는 심지어 사용자가 대담하지도 않은 것을 좋아합니다.
HungryPipo

1
@Dominic 이제 당신은 완전한 대답을 바꾸고 언급없이 (내가 편집 한) 내 의견에서 가져 왔습니다. 잘 했어요 👏 😁😁
Koushik Chatterjee

1
@KoushikChatterjee 님이 다시 추가 함
Dominic

2
더 도움이 되겠습니까? const arr = Object.keys(obj).map(id => ({ id, ...obj[id] })); 이것은 전체 객체를 반환 된 데이터로 가져올 수 있습니까? (원래
asker가

20

나를 위해, 이것은 효과가 있었다 :

_.map(_.toPairs(data), d => _.fromPairs([d]));

돌아서 다

{"a":"b", "c":"d", "e":"f"} 

으로

[{"a":"b"}, {"c":"d"}, {"e":"f"}]

1
원래 객체의 각 키 / 값이 배열의 {key : value} 객체가되는 방식으로 객체를 Array로 변환해야했습니다. _.toPairs (data)는 { "a": "b", "c": "d", "e": "f"} 객체를 가져 와서 [[ "a": "와 같은 배열의 배열로 반환합니다. b "], ["c ":"d "], ["e ":"f "]]. _.fromPairs는 반대로 ""a ","b "]라는 두 개의 요소가있는 배열을 가져 와서 {"a ":"b "} 객체로 반환합니다. _.fromPairs의 도움으로 _.toPairs에서 만든 배열을 객체 배열로 변환하는 경우 _.map을 사용하여 배열을 반복했습니다.
NoNine

1
이것을보기 위해 아래로 스크롤 한 것이 기쁩니다. 귀하의 솔루션이 나를 위해 일했습니다! 감사!
Wale

@NoNine 배열 (배열)에 맵을 적용 할 필요가 없으며 입력 객체에 직접 적용 할 수 있으며 각 키 값 쌍을 반환하면 _.map(data, (v,k)=>({[k]: v}))자세한 내용은 내 대답을 참조하십시오. _.toPairs그리고 _fromPairs여기에 추가하고 불필요한입니다.
Koushik Chatterjee

이것은 질문의 의도가 아닙니다. 각 항목에 키 (알 수없는)가 포함되어 있기 때문에 결과를 사용하기가 다소 어려우므로 다시 값을 얻으려면 각 개별 항목에 대해 일부 논리 (예 : Object.keys 또는 Object.values)를 거쳐야합니다. 장난감 희망 다음 키를 보존하는 경우 각, 당신은 같은 stuctrured 것을 객체의 배열을 만들 수 있습니다[{key: 'someKey', val: 'The value'}, {....},...]
코식 터지

13

결과를 얻는 데는 몇 가지 방법이 있습니다. 카테고리로 분류하자 :

ES6 값만 :

이에 대한 주요 방법은 Object.values 입니다. 그러나 Object.keysArray.map 을 사용 하면 예상 결과를 얻을 수 있습니다.

Object.values(obj)
Object.keys(obj).map(k => obj[k])

ES6 키 및 가치 :

map 및 ES6 동적 / 계산 된 속성을 사용하고 파괴 하면 키를 유지하고 맵에서 객체를 반환 할 수 있습니다.

Object.keys(obj).map(k => ({[k]: obj[k]}))
Object.entries(obj).map(([k,v]) => ({[k]:v}))

Lodash 값만 :

_.values그러나 이를 위해 설계된 방법 은 "바로 가기"와 같은 _.map유틸리티 방법과 객체 의 값만_.toArray 포함하는 배열을 반환하는 유틸리티 방법 이 있습니다 . 당신은 할 수도 불구 하고 사용하여 개체의 값을 가져 표기합니다._.map_.keysobj[key]

참고 : _.map객체가 전달되면 baseMap기본적으로 forEach객체 속성에있는 핸들러를 사용 합니다.

_.values(obj)
_.map(obj)
_.toArray(obj)
_.map(_.keys(obj), k => obj[k])

Lodash 키 및 가치 :

// Outputs an array with [[KEY, VALUE]]
_.entries(obj)
_.toPairs(obj)

// Outputs array with objects containing the keys and values
_.map(_.entries(obj), ([k,v]) => ({[k]:v}))
_.map(_.keys(obj), k => ({[k]: obj[k]}))
_.transform(obj, (r,c,k) => r.push({[k]:c}), [])
_.reduce(obj, (r,c,k) => (r.push({[k]:c}), r), [])

위의 예에서는 ES6이 사용됩니다 (화살표 기능 및 동적 속성). _.fromPairsES6이 문제인 경우 lodash 및 기타 방법을 사용 하여 객체를 작성할 수 있습니다 .


12

키 (이 경우 ID)를 각 배열 항목의 속성으로 유지하려면 다음을 수행하십시오.

const arr = _(obj) //wrap object so that you can chain lodash methods
            .mapValues((value, id)=>_.merge({}, value, {id})) //attach id to object
            .values() //get the values of the result
            .value() //unwrap array of objects

8

2017 업데이트 : Object.values , lodash toArray 가 수행합니다. 그리고 키 을 유지 하고 연산자를 멋지게 퍼 뜨리 려면 :

// import { toArray, map } from 'lodash'
const map = _.map

const input = {
  key: {
    value: 'value'
  }
}

const output = map(input, (value, key) => ({
  key,
  ...value
}))

console.log(output)
// >> [{key: 'key', value: 'value'}])
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>


7

일반 JavaScript ( ECMAScript-2016)를 사용 하여 객체를 배열로 변환 Object.values:

var obj = {
    22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[]}},
    12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[]}}
}

var values = Object.values(obj)

console.log(values);

키를 계속 사용하려면 다음 Object.entriesArray#map같이 사용 하십시오.

var obj = {
    22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[]}},
    12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[]}}
}

var values = Object.entries(obj).map(([k, v]) => ({[k]: v}))

console.log(values);


5

var arr = _.map(obj)

_.map함수와 ( lodashunderscore)를 함께 사용할 수 있으며 object, 내부적으로 해당 경우를 처리하고 각 값과 키를 반복자와 반복하고 마지막으로 배열을 반환합니다. 실제로 _.map(obj)값의 배열을 원한다면 iteratee (just ) 없이 사용할 수 있습니다 . 좋은 부분은 중간에 변환이 필요한 경우 한 번에 수행 할 수 있다는 것입니다.

예:

그러나 객체를 변환하려면 키를 유지해야하더라도 _.map(obj, (v, k) => {...}추가 인수 map를 사용 하여 ( ) 작업을 수행 한 다음 원하는 방식으로 사용할 수 있습니다.

그러나 이것에 대한 다른 Vanilla JS 솔루션이 있습니다 (모든 lodash솔루션에는 순수한 JS 버전이 있어야 함).

  • Object.keys그런 다음 map가치에
  • Object.values (ES-2017에서)
  • Object.entries그런 다음 map각 키 / 값 쌍 (ES-2017)
  • for...in 페팅 값에 대해 각 키를 반복 사용

그리고 훨씬 더. 그러나이 질문은 lodash(그리고 이미 누군가 그것을 사용한다고 가정 할 때) 버전, 메소드 지원 및 오류 처리가 발견되지 않은 경우 오류 처리에 대해 많이 생각할 필요가 없습니다.

_.values(특정 perpose에 대해 더 읽기 쉬운) 또는 쌍을 얻은 다음 매핑하는 등 다른 lodash 솔루션이 있습니다 . 그러나 코드에 유연성이 필요한 경우 keys값을 조금 유지 하거나 변환 해야 할 때 나중에 업데이트 할 수 있는 가장 좋은 해결책은 _.map이 답변에서 추가 된대로 단일을 사용하는 것입니다. 그것은 가독성에 따라 그렇게 어렵지 않을 것입니다.


2
멋지고 매우 간단하고 간결합니다.
edencorbin

5

배열 할 객체

모든 답변 중에서 나는 이것이 최고라고 생각합니다.

let arr = Object.entries(obj).map(([key, val]) => ({ key, ...val }))

그 변형 :

{
  a: { p: 1, q: 2},
  b: { p: 3, q: 4}
}

에:

[
  { key: 'a', p: 1, q: 2 }, 
  { key: 'b', p: 3, q: 4 }
]

객체 대 배열

되돌리려면 :

let obj = arr.reduce((obj, { key, ...val }) => { obj[key] = { ...val }; return obj; }, {})

키를 값으로 유지하면서 다시 변환하려면 :

let obj = arr.reduce((obj, { key, ...val }) => { obj[key] = { key, ...val }; return obj; }, {})

줄게:

{
  a: { key: 'a', p: 1, q: 2 },
  b: { key: 'b', p: 3, q: 4 }
}

마지막 예를 들어, 당신은 또한 lodash 사용할 수 있습니다 _.keyBy(arr, 'key')또는 _.keyBy(arr, i => i.key).


3

Object에 대한 일부 사용자 정의 매핑 (예 : Original Array.prototype.map)을 배열로 사용하려면 _.forEach다음을 사용하십시오 .

let myObject = {
  key1: "value1",
  key2: "value2",
  // ...
};

let myNewArray = [];

_.forEach(myObject, (value, key) => {
  myNewArray.push({
    someNewKey: key,
    someNewValue: value.toUpperCase() // just an example of new value based on original value
  });
});

// myNewArray => [{ someNewKey: key1, someNewValue: 'VALUE1' }, ... ];

lodash_.forEach의 문서 참조 https://lodash.com/docs/#forEach

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.