JavaScript에서 Object {}를 키-값 쌍의 배열 []으로 변환하는 방법


243

다음과 같은 객체를 변환하고 싶습니다.

{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}

다음과 같이 키-값 쌍의 배열로

[[1,5],[2,7],[3,0],[4,0]...].

JavaScript에서 객체를 키-값 쌍의 배열로 변환하려면 어떻게해야합니까?

답변:


429

당신은 이것을 Object.keys()하고 map()할 수 있습니다

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
  return [Number(key), obj[key]];
});

console.log(result);


6
@blvckasvp 숫자를 키로 사용하고 있습니까? 그렇지 않으면 키를 숫자로 변환하려고 할 때 실패하고 NaN대신 반환 됩니다. 당신은, 당신의 열쇠로 문자열을 사용에서 수익을 변경하려는 경우 [Number(key), obj[key]][key, obj[key]]또는를 사용 Object.entries@Pila 자신의 대답에 제안
scottbot95

123

가장 좋은 방법은 :

var obj ={"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10"‌​:0,"11":0,"12":0} 
Object.entries(obj);

entries여기에 표시된대로 호출 하면 [key, value]요청자가 요청한대로 쌍 을 반환 합니다.

또는을 호출하면 Object.values(obj)값만 반환됩니다.


6
친애하는 개발자 여러분, 몇 분 전에 출시 된 브라우저와 만 호환되는 멋진 기능을 채택하기 전에 ECMA 호환성 표를 확인하십시오.
andreszs

8
@andreszs See I Use table을 참조하십시오 .IE 지원을 포기하지 않으려는 경우 (2019 년에는 실제로 당신이하지 않기를 바랍니다) 그러면 갈 수 있습니다. FF 47은 2016 년 6 월부터, Chrome 54는 같은 해 10 월부터 Edge 8 월 14 일입니다. 정확히 몇 분 전이 아닙니다.
Kyll

참고 : Object.entries는 [key, value]를 반환하지만 키는 문자열이며 값은 다릅니다.
SHAHBAZ

62

Object.entries()요소가 [key, value]직접 열거 할 수있는 열거 가능한 속성 쌍에 해당하는 배열 인 배열을 반환합니다.object . 속성의 순서는 객체의 속성 값을 수동으로 반복하여 주어진 순서와 동일합니다.

-https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description

Object.entries함수는 키가 숫자 대신 문자열 인 것을 제외하고는 거의 정확한 결과를 반환합니다.

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

console.log(Object.entries(obj));

키가 숫자가되어야하는 경우 각 쌍의 키를 강제 된 숫자로 바꾸는 콜백 함수를 사용하여 결과를 새 배열에 매핑 할 수 있습니다.

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

const toNumericPairs = input => {
    const entries = Object.entries(input);
    return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}

console.log(toNumericPairs(obj));

Object.assign위의 예제에서 화살표 함수와 맵 콜백을 사용하여 Object.assign할당되는 객체 를 반환하는 사실을 활용하여 하나의 명령으로 유지할 수 있으며 단일 명령 화살표 함수의 반환 값은 명령의 결과입니다.

이것은 다음과 같습니다.

entry => {
    entry[0] = +entry[0];
    return entry;
}

주석에서 @TravisClarke가 언급했듯이 맵 기능은 다음과 같이 단축 될 수 있습니다.

entry => [ +entry[0], entry[1] ]

그러나 기존 배열을 수정하지 않고 각 키-값 쌍에 대해 새 배열을 작성하므로 키-값 쌍 배열의 양이 두 배가됩니다. 원래 항목 배열에 여전히 액세스 할 수 있지만 해당 항목과 가비지 수집되지 않습니다.

이제 in-place 메소드를 사용하여 키-값 쌍을 보유하는 두 개의 배열 (입력 및 출력 배열)을 계속 사용하더라도 총 배열 수는 하나씩 만 변경됩니다. 입력 및 출력 배열은 실제로 배열로 채워지는 것이 아니라 배열에 대한 참조이며 해당 참조는 메모리에서 무시할만한 공간을 차지합니다.

  • 각 키-값 쌍을 내부에서 수정하면 메모리 크기는 무시할만한 수준으로 증가하지만 문자를 몇 개 더 입력해야합니다.
  • 각 키-값 쌍에 대해 새 배열을 만들면 필요한 메모리 양이 두 배가되지만 문자를 조금 더 입력해야합니다.

한 단계 더 나아가 엔트리 배열을 새로운 배열에 매핑하는 대신 내부에서 수정함으로써 성장을 완전히 없앨 수 있습니다.

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

const toNumericPairs = input => {
  const entries = Object.entries(obj);
  entries.forEach(entry => entry[0] = +entry[0]);
  return entries;
}

console.log(toNumericPairs(obj));


1
나는 기능적인 접근법을 좋아한다. 더 짧은 대안으로 :Object.entries(obj).map(e => [+e[0], e[1]]);
Travis Clarke

21

ES6가 표준 인 2018 년에 이러한 답변 중 일부를 요약합니다.

객체로 시작 :

let const={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
  • 맹목적으로 배열에서 값을 얻으려면 키를 신경 쓰지 마십시오.

const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.values(obj));
//[9,8,7,6,5,4,3,2,1,0,5]

  • 배열에서 쌍을 얻는 간단한 방법 :

const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj));
//[["1",9],["2",8],["3",7],["4",6],["5",5],["6",4],["7",3],["8",2],["9",1],["10",0],["12",5]]

  • 이전과 동일하지만 각 쌍에 숫자 키가 있습니다.

const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).map(([k,v])=>[+k,v]));
//[[1,9],[2,8],[3,7],[4,6],[5,5],[6,4],[7,3],[8,2],[9,1],[10,0],[12,5]]

  • 새 배열의 키로 object 속성을 사용하면 희소 배열을 만들 수 있습니다.

const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).reduce((ini,[k,v])=>(ini[k]=v,ini),[]));
//[undefined,9,8,7,6,5,4,3,2,1,0,undefined,5]

이 마지막 방법은 키 값에 따라 배열 순서를 재구성 할 수도 있습니다. 때로는 이것이 원하는 행동 일 수도 있습니다 (때로는 그렇지 않습니다). 그러나 이제 장점은 값이 올바른 배열 슬롯에 색인되어 검색을 수행하는 데 필수적이며 사소한 것입니다.

  • 배열 대신 맵

마지막으로 (원래 질문의 일부는 아니지만 완전성을 위해) 키 또는 값을 사용하여 쉽게 검색해야하지만 숫자 배열로 변환 할 필요없이 희소 배열, 중복 및 재정렬을 원하지 않는 경우 ( 심지어 매우 복잡한 키에 액세스 할 수있는 경우) 배열 (또는 객체)이 필요하지 않습니다. 나는 추천 할 것이다Map대신 합니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

let r=new Map(Object.entries(obj));
r.get("4"); //6
r.has(8); //true

2
네 번째 글 머리 기호 이상은 질문과 전혀 관련이 없으며 나머지 답변은 여기에서 상위 3 가지 답변을 요약합니다. 이 답변은 아직 여기에 없었거나 완전히 관련이없는 토론에 아무것도 가져 오지 않습니다.

그렇습니다. 첫 번째 줄 상태 인 답변의 요약입니다. 그런 다음 풀 블로우 기능 대신 최신 ES6 기술을 사용하도록 업데이트하십시오. 네 번째 답변은 연관 배열 (예 : PHP)을 지원하는 언어에서 JSON 배열을 이동할 때 유용합니다.
CarlosH.

여기에 제공된 모든 방법은 이미 상위 3 개 답변 중 2 개에서 일반 형태로 제공되었으며 기능이 없으므로 귀하가 무엇을하고 있는지 알 수 없습니다. 내가 말했듯이 4 번째까지는 질문 된 질문과 완전히 관련이 없습니다. 다른 질문과 관련이있을 수 있지만이 질문에는 해당되지 않습니다. 어쨌든 JSON은 PHP, JavaScript 또는 Haskell을 사용하여 생성 되었든 JSON입니다.

18

Object.entries당신에게 효과가 없다면 또 다른 해결책 .

const obj = {
      '1': 29,
      '2': 42
    };
const arr = Array.from(Object.keys(obj), k=>[`${k}`, obj[k]]);
console.log(arr);


1
이것은 나를 위해 일했습니다. JSON을 가져올 때 Angulars ngFor 루프를 사용할 수없는 색인을 추가하는 문제가 발생했습니다. 이것은 구조를 유지하면서 인덱스를 제거했습니다.
RAC

"indices"대신 "indexes"를 사용하는 경우 @RAC +1 Begone, 구식 (즉, 임의적이고 의미가없는) 영어 전통!
Venryx

12

Ecmascript 6에서

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

var res = Object.entries(obj);

console.log(res);

깡깡이


이것이
다운 보트 된

1
나는 공감하지 않았지만 그 .map((value)=>(value))부분은 의미 가 없다는 점에 주목하십시오 -그것은 Object.entries(obj)호출 에서 얻은 것과 정확히 동일한 항목 배열을 반환합니다 .
Venryx

8

사용하다 Object.keysArray#map방법.

var obj = {
  "1": 5,
  "2": 7,
  "3": 0,
  "4": 0,
  "5": 0,
  "6": 0,
  "7": 0,
  "8": 0,
  "9": 0,
  "10": 0,
  "11": 0,
  "12": 0
};
// get all object property names
var res = Object.keys(obj)
  // iterate over them and generate the array
  .map(function(k) {
    // generate the array element 
    return [+k, obj[k]];
  });

console.log(res);


7

사용 Object.entries에서의 Object의 각 요소 얻기 위해 key & value다음 형식을 map다음과 같이 그들을 통해 :

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}

var res = Object.entries(obj).map(([k, v]) => ([Number(k), v]));

console.log(res);

그러나 키가 점진적으로 정렬 될 것이 확실하다면 다음과 같이 사용 Object.values하고 Array#map수행 할 수 있습니다 .

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}; 

                        // idx is the index, you can use any logic to increment it (starts from 0)
let result = Object.values(obj).map((e, idx) => ([++idx, e]));

console.log(result);



5

lodash를 사용하면 위에 제공된 답변 외에도 출력 배열에 키를 가질 수 있습니다.

출력 배열에 객체 키가없는 경우

에 대한:

const array = _.values(obj);

obj가 다음과 같은 경우 :

{ art”: { id: 1,  title: aaaa }, fiction”: { id: 22,  title: 7777”} }

그런 다음 배열은 다음과 같습니다.

[ { id: 1, title: aaaa }, { id: 22, title: 7777 } ]

출력 배열에서 객체 키로

대신 쓰는 경우 ( 'genre'는 선택한 문자열입니다) :

const array= _.map(obj, (val, id) => {
    return { ...val, genre: key };
  });

당신은 얻을 것이다 :

[ 
  { id: 1, title: aaaa , genre: art”}, 
  { id: 22, title: 7777”, genre: fiction }
]

4

이 간단한 솔루션을 사용하는 것이 좋습니다. Object.entries()

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result =Object.entries(obj)

console.log(result);


1

을 사용할 수 있습니다 Object.values([]). 아직 작성하지 않은 경우이 폴리 필이 필요할 수 있습니다.

const objectToValuesPolyfill = (object) => {
  return Object.keys(object).map(key => object[key]);
};
Object.values = Object.values || objectToValuesPolyfill;

https://stackoverflow.com/a/54822153/846348

그럼 당신은 할 수 있습니다 :

var object = {1: 'hello', 2: 'world'};
var array = Object.values(object);

js의 배열은 숫자 키 만 사용할 수 있으므로 객체에서 다른 것을 사용하면`0,1,2 ... x``가됩니다.

예를 들어 고유 키가있는 경우 중복을 제거하는 것이 유용 할 수 있습니다.

var obj = {};
object[uniqueKey] = '...';

0

사용 에 대한

var obj = { "10":5, "2":7, "3":0, "4":0, "5":0, "6":0, "7":0,
            "8":0, "9":0, "10":0, "11":0, "12":0 };

var objectToArray = function(obj) {
    var _arr = [];

    for (var key in obj) {
        _arr.push([key, obj[key]]);
    }
    return _arr;
}

console.log(objectToArray(obj));

0

객체를 배열로 재귀 변환

function is_object(mixed_var) {
    if (mixed_var instanceof Array) {
        return false;
    } else {
        return (mixed_var !== null) && (typeof( mixed_var ) == 'object');
    }
}


function objectToArray(obj) {
    var array = [], tempObject;
    for (var key in obj) {

        tempObject = obj[key];

        if (is_object(obj[key])) {
            tempObject = objectToArray(obj[key]);
        }
        array[key] = tempObject;
    }
    return array;
}

0

아래와 같이 키의 숫자를 문자열 유형으로 변경할 수 있습니다.

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
  return [String(key), obj[key]];
});
    
console.log(result);


0

이것은 내 솔루션이며, 같은 문제가 있으며이 솔루션이 나를 위해 작동하는 것처럼 보입니다.

yourObj = [].concat(yourObj);

0

이것은 내 단순한 베어 본 구현입니다.

let obj = {
  "1": 5,
  "2": 7,
  "3": 0,
  "4": 0,
  "5": 0,
  "6": 0,
  "7": 0,
  "8": 0,
  "9": 0,
  "10": 0,
  "11": 0,
  "12": 0
};    

const objectToArray = obj => {
      let sol = [];
      for (key in obj) {
        sol.push([key, obj[key]]);
      }
      return sol;
    };

objectToArray(obj)

0

간단한 솔루션

`

var result = Object.keys(records).map(function (value) {
         return { [value]: records[value] };
});
console.log(result);


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