배열을 객체로 변환


514

변환하는 가장 좋은 방법은 무엇입니까?

['a','b','c']

에:

{
  0: 'a',
  1: 'b',
  2: 'c'
}

3
어쩌면 그가 필요한 것은 오리 타이핑 코드 가 Array 인스턴스라고 생각 하지 않는 것입니다.
Pointy

6
Javascript 배열 객체 라는 것을 지적 할 가치 있습니다.
Spudley

다른 사람이 Lodash 솔루션을 찾고 있다면 _.keyBy(이전 _.indexBy) : lodash.com/docs#keyBy
2540625

배열은 이미 객체이기 때문에 약간 혼란 스럽지만 문제의 핵심은 배열 이국적인 객체일반 객체 로 변환하는 것 같습니다 .
Oriol

1
Lodash로이를 수행하는 간단한 방법은 _.toPlainObject입니다. 예 :var myObj = _.toPlainObject(myArr)
Julian Soro

답변:


473

ECMAScript 6은 쉽게 폴리 필 가능합니다 Object.assign:

Object.assign()메소드는 열거 가능한 모든 자체 특성의 값을 하나 이상의 소스 오브젝트에서 대상 오브젝트로 복사하는 데 사용됩니다. 대상 객체를 반환합니다.

Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}

length배열 의 자체 속성은 열거 할 수 없으므로 복사되지 않습니다.

또한 ES6 스프레드 구문 을 사용 하여 동일한 결과를 얻을 수 있습니다.

{ ...['a', 'b', 'c'] }

원래 객체에서 정렬 된 속성 배열이 이미있는 경우 스프레드 연산자를 사용하면 해당 배열을 새 객체로 직접 변환 할 수 있습니다.{ ...[sortedArray]}
HappyHands31

Oriol, 0 & 1 대신 고정 키를 설정하는 방법이 있습니까?
Menai Ala Eddine

488

이 같은 기능으로 :

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    rv[i] = arr[i];
  return rv;
}

배열은 이미 객체 일 뿐이지 만 정수 이름 속성과 관련하여 "관심있는"특별한 동작이 있습니다. 위의 내용은 일반 객체를 제공합니다.

편집 오 또한 배열에서 "구멍"에 대한 계정에 할 수 있습니다 :

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[i] = arr[i];
  return rv;
}

최신 JavaScript 런타임에서는 다음 .reduce()방법을 사용할 수 있습니다 .

var obj = arr.reduce(function(acc, cur, i) {
  acc[i] = cur;
  return acc;
}, {});

그것은 또한 배열에서 "구멍"을 피 .reduce()합니다. 그것이 작동 하는 방식 이기 때문입니다 .


2
@ m93a 이미 객체입니다. JavaScript에서는 []숫자 속성 키와 "길이"속성을 사용하지 않을 경우 실제로 Array 인스턴스 ( )를 만들지 않아도됩니다.
Pointy

14
피하기 PARAM의 재 할당에 청소기 방법const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
huygn

3
명시 적 반환없이 화살표 + 구조화 구문 :const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib

2
실제로 @eugene_sunic이지만 2010 년에이 질문에 대답했을 때이 방법을 사용할 수 없었습니다.
Pointy

2
@miro가 지적했듯이 매번 새로운 객체를 생성 할 필요는 없으며 실제로 생성 된 초기 객체를 조작하는 것보다 훨씬 느립니다 . 1000 개의 요소 배열에서 JSPerf 테스트를 실행하여 매번 새 오브젝트를 작성 하면 기존 오브젝트를 변경하는 것보다 1,000 배 느립니다. jsperf.com/…
romellem

281

어큐뮬레이터 일명 사용할 수 있습니다 reduce.

['a','b','c'].reduce(function(result, item, index, array) {
  result[index] = item; //a, b, c
  return result;
}, {}) //watch out the empty {}, which is passed as "result"

빈 개체 {}를 시작점으로 전달하십시오. 그런 다음 해당 개체를 증분 "증가"합니다. 반복이의 말에 result있을 것입니다{"0": "a", "1": "b", "2": "c"}

배열이 키-값 쌍 객체 세트 인 경우 :

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  result[key] = item[key];
  return result;
}, {});

생산할 것이다 : {a: 1, b: 2, c: 3}

완전성을 위해 reduceRight배열을 역순으로 반복 할 수 있습니다.

[{ a: 1},{ b: 2},{ c: 3}].reduceRight(/* same implementation as above */)

생산할 것이다 : {c:3, b:2, a:1}

어큐뮬레이터는 특정 목적을 위해 모든 유형이 될 수 있습니다. 예를 들어 배열에서 객체의 키와 값을 바꾸려면 []다음을 전달하십시오 .

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  var value = item[key];
  var obj = {};
  obj[value] = key;
  result.push(obj);
  return result;
}, []); //an empty array

생산할 것이다 : [{1: "a"}, {2: "b"}, {3: "c"}]

달리 map, reduce1-1 매핑으로 사용할 수 없습니다. 포함 또는 제외하려는 항목을 완전히 제어 할 수 있습니다. 따라서 reduce당신이 무엇을 달성 할 수 filter있게하는 않는 reduce매우 다양한 :

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  if(index !== 0) { //skip the first item
    result.push(item);
  }
  return result;
}, []); //an empty array

생산할 것이다 : [{2: "b"}, {3: "c"}]

주의 : reduceObject.key일부입니다 ECMA 5th edition; 지원하지 않는 브라우저 (특히 IE8)에 대한 폴리 필을 제공해야합니다.

Mozilla 의 기본 구현을 참조하십시오 .


1
객체 맵을 사용하고 키 중 하나를 삭제해야 할 때 redux store를 유지하는 데 도움이됩니다
dhruvpatel

101

jquery를 사용하는 경우 :

$.extend({}, ['a', 'b', 'c']);

4
이상하게도, Array 변수를 지정하면 모든 문자를 별도의 객체에 넣습니다. 0 : "a", 1 : ",", 2 : "b"... 따옴표는 무시하지만 쉼표는 포함합니다 .. .
TrySpace

@ 맥스 나는 그런 행동이 없다고 생각합니다. 반환 된 개체는 {0: 'a', 1: 'b', 2: 'c'}예상 결과입니다.
ivkremer 2011

3
$ .extend를 사용하여 키를 비 숫자 방식으로 알리는 방법이 있습니까? 즉, 배열 항목에서 계산을 수행합니까?
다비 리마

슈퍼 끔찍하고 짧은 테스트
파이살 Mehmood Awan

63

완전성을 위해 ECMAScript 2015 (ES6) 확산. 트랜스 파일러 (Babel) 또는 ES6 이상을 실행하는 환경이 필요합니다.

console.log(
   { ...['a', 'b', 'c'] }
)


2
실제로 이것은 ES2015에서도 기본적으로 제공되지 않습니다. 그러나 매우 우아합니다.
Aluan Haddad

47

아마 이런 식으로 쓸 것입니다 (매우 드물게 underscorejs 라이브러리가 없기 때문에).

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }

9
당신은 내 응답을 downvote하지만 코멘트가 없습니다? 내 대답은 정확하고 테스트되었습니다. 이의 제기 란 무엇입니까?
Dave Dopson 2016 년

14
이 질문에는 밑줄 태그가 없으며 node.js 또는 필수 라이브러리를 가정하고 있습니다.
David Hellsing

10
밑줄은 클라이언트와 서버 모두에서 매우 일반적입니다. Backbone.js로 가정되며 아마도 가장 일반적인 유틸리티 라이브러리 일 것입니다. 즉, 라이브러리를 사용하고 있음을 분명히하기 위해 require 라인을 포함 시켰습니다. "페이지에 underscore.js 추가"를 설명하는 1-liner가 없으므로 브라우저 환경에 일부 번역이 필요합니다
Dave Dopson

6
여전히 undserscore를 사용하는 경우 간단한 obj=_.extend({},a);작업이 가능합니다. 또한 배열을 반복하는 경우 _.each보다 적합 하다고 말할 수 있습니다 _.map. 대체로 이것은 여러 수준에서 좋은 대답이 아닙니다.
David Hellsing

4
"당신은 밑줄이나 대쉬를 언급하지 않고 대답해야한다"사람들은 매우 성가시다. 표준 라이브러리를 언급하지 않고 C ++ 질문에 대답해야한다는 것과 비교할 수 있습니다. 밑줄 또는로 대시가 옵션이 아닌 경우 OP는이를 언급해야합니다.
Charlie Martin

26

여기 완전성을위한 O (1) ES2015 방법이 있습니다.

var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object

(1) MDN 에 따르면 객체의 [[프로토 타입]]을 변경하는 것은 매우 느립니다. (2) 이것은 자신의 length재산을 제거하지 않습니다 . (3) 객체는 여전히 배열 Array.isArray(arr) === true입니다. (4) 특수 배열 동작은 제거되지 않습니다 (예 : arr.length = 0모든 인덱스 제거). (5) 따라서 나는 Object.assign훨씬 낫다고 생각 합니다.
Oriol

1
@Oriol mdn은 적어도 V8 (그러나 다른 엔진)에서는 잘못되었습니다.이 특별한 경우에는 매우 빠른 작업입니다. 어쨌든 숫자 저장소가 있기 때문에 기본적으로 두 개의 포인터가 변경됩니다.
Benjamin Gruenbaum 2016 년

이것은 또한 배열에서 인덱스가 아닌 ( "자체") 속성을 유지하는 다른 빠른 솔루션 중에서도 독특하다는 사실에도 사용될 수 있습니다 (즉, 양의 정수가 아닌 속성) ...
Brett Zamir

그러나 흠, Array.isArray반환 true하더라도 여기에 "개체"를 instanceof Array...하지 않습니다
브렛 Zamir

버그처럼 들리는 @BrettZamir : D
Benjamin Gruenbaum

26

보지 못했다-

console.log(
  Object.assign({}, ['a', 'b', 'c'])
)


만들 수있는 모든 스마트 제안 { "first":"a", "second":"b","third":"c" }키가 고정되어 함께 - 나는 파괴를 찾고 있어요
mplungjan

@mplungjan이 경우 할당 대신 reduce를 사용하는 것이 좋습니다. 필요한 경우 모든 서수를 열거 할 수있는 라이브러리가있을 수 있습니다.
Wylliam Judd

오늘 또 다른 사건이있었습니다. 나는 그것에 대해 질문했다 : stackoverflow.com/questions/62197270/destruct-using-titles/…
mplungjan

23

Array를 Object로 변환하는 데 사용 Object.assign하고 array.reduce기능 할 수 있습니다 .

var arr = [{a:{b:1}},{c:{d:2}}] 
var newObj = arr.reduce((a, b) => Object.assign(a, b), {})

console.log(newObj)


이것이 내가 찾던 것입니다. 나는 indeces가 필요하지 않았으며 배열을 유지 된 키-값 쌍으로 변환해야했습니다.
Mike K

18

ECMAScript 2015 (ES6) 표준의 일부이기 때문에 객체 확산 연산자를 사용했습니다.

const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}

다음과 같은 바이올린 을 예로 들었습니다 .


1
나는 이것의 성능에 대해 확신하지 못하지만 많은 Array to Object 변환 중 (모든 코드에 대해 객체를 사용하여 표준화하기 때문에) 가장 쉬운 방법 일 것입니다.
누군가 특별한

동일한 솔루션을 제공 한 기존의 어떤 답변보다 이것이 더 낫습니까?
Dan Dascalescu

17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

현대 JavaScript에서 쉬운 방법 Object.assign()은 한 객체에서 다른 객체로 key : value를 복사하는 것 외에는 아무것도하지 않는 것입니다. 이 경우 Array속성을 new에 기부합니다 {}.


동일한 솔루션을 제공 한 기존의 어떤 답변보다 이것이 더 낫습니까?
Dan Dascalescu

내가 대답을 추가했을 때 Dan Dascalescu는 위의 답변 만 O.assign있었지만 설명이 부족했습니다. 요즘 배열을 객체로 파괴하는 방법은 ( {...array})
Appeiron


11

5 년 후, 좋은 방법이 있습니다 :)

Object.assign ECMAScript 2015에 도입되었습니다.

Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}

10

javascript#forEach하나를 사용하면 이 작업을 수행 할 수 있습니다

var result = {},
    attributes = ['a', 'b','c'];

attributes.forEach(function(prop,index) {
  result[index] = prop;
});

ECMA6 사용시 :

attributes.forEach((prop,index)=>result[index] = prop);

10

FWIW, 하나는 또 다른 최근의 접근 방식은 새로운를 사용하는 것입니다 Object.fromEntries와 함께 Object.entries다음과 같다 :

const arr = ['a','b','c'];
arr[-2] = 'd';
arr.hello = 'e';
arr.length = 17;
const obj = Object.fromEntries(Object.entries(arr));

...로서 기억 희소 배열 항목 회피 가능 undefined하거나 null및 비 보존 지수 (예를 들면, 비 양성 정수 / 숫자가 아닌) 키.

arr.length그러나 포함되지 않은 을 추가 할 수 있습니다.

obj.length = arr.length;


9

ES6을 사용하는 경우 Object.assign 및 스프레드 연산자를 사용할 수 있습니다

{ ...['a', 'b', 'c'] }

다음과 같이 중첩 배열이있는 경우

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))

1
변수 이름이 다를뿐 아니라 예제가 작동하지 않으므로 생성자에서 맵을 만들려면 처음에 2d 키-값 배열이 필요합니다. new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins

5

빠르고 더러운 것 :

var obj = {},
  arr = ['a','b','c'],
  l = arr.length; 

while( l && (obj[--l] = arr.pop() ) ){};

나는 당신이 그것을 테스트하는 것을 잊었다 고 생각합니다. 그것은 생산한다 {0:"c", 1:"b", 2:"a"}. 당신도 원하는 unshift대신 pop또는 (더 나은)로 시작하는 i=arr.length-1대신 감소.
Phrogz

예 .. 방금 변경했지만 흥미가 떨어졌습니다 : /
Mic

심지어 할 수 l = arr.length있었고 while (l && (obj[--l] = arr.pop())){}(이것은 오래되었지만 더 단순화하지 않는 이유는 무엇입니까?)
Qix-MONICA가 MISTREATED

2
@Qix, 멋진 단축
Mic

4

빠르고 더러운 # 2 :

var i = 0
  , s = {}
  , a = ['A', 'B', 'C'];

while( a[i] ) { s[i] = a[i++] };

쉼표 표기법을 사용하는 이유는 무엇입니까?
코너 룰

3
다음 줄에서 쉼표를 사용하는 것이 좋습니다. 이 표기법을 읽기가 더 쉽습니다.
BingeBoy 2016 년

1
배열에 잘못된 값이 포함 된 경우 루프가 중지됩니다. i < a.length대신 확인해야합니다 a[i].
Oriol

4

Lodash 3.0.0의로서 당신은 사용할 수 있습니다 _.toPlainObject을

var obj = _.toPlainObject(['a', 'b', 'c']);
console.log(obj);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>


3

방금 작성한 재귀 함수가 있습니다. 간단하고 잘 작동합니다.

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}

다음은 예제입니다 ( jsFiddle ).

var array = new Array();
array.a = 123;
array.b = 234;
array.c = 345;
var array2 = new Array();
array2.a = 321;
array2.b = 432;
array2.c = 543;
var array3 = new Array();
array3.a = 132;
array3.b = 243;
array3.c = 354;
var array4 = new Array();
array4.a = 312;
array4.b = 423;
array4.c = 534;
var array5 = new Array();
array5.a = 112;
array5.b = 223;
array5.c = 334;

array.d = array2;
array4.d = array5;
array3.d = array4;
array.e = array3;


console.log(array);

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}
console.log(convArrToObj(array));

결과 : 재귀 배열 대 객체


정말 잘 작동합니다. 감사합니다
Hanmaslah

이것이 완벽하게 작동 ['a' = '1', 'b' = '2', 'c' = '3']하는 것처럼 원한다면 더 높아야합니다 {a: 1, b: 2, c: 3}.
Wanjia

3
.reduce((o,v,i)=>(o[i]=v,o), {})

[문서]

또는 더 자세한

var trAr2Obj = function (arr) {return arr.reduce((o,v,i)=>(o[i]=v,o), {});}

또는

var transposeAr2Obj = arr=>arr.reduce((o,v,i)=>(o[i]=v,o), {})

바닐라 JS가있는 가장 짧은 것

JSON.stringify([["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[i]=v,o}, {}))
=> "{"0":["a","X"],"1":["b","Y"]}"

좀 더 복잡한 예

[["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[v[0]]=v.slice(1)[0],o}, {})
=> Object {a: "X", b: "Y"}

더 짧아짐 ( function(e) {console.log(e); return e;}=== 사용 (e)=>(console.log(e),e))

 nodejs
> [[1, 2, 3], [3,4,5]].reduce((o,v,i)=>(o[v[0]]=v.slice(1),o), {})
{ '1': [ 2, 3 ], '3': [ 4, 5 ] }

[/ 문서]


무엇을 의도 [/docs]했습니까? 코드 스 니펫을 실행 가능하게 만드는 것이 더 유용합니다.
Dan Dascalescu

3

나는 이것을 간단히 할 것이다 Array.of(). 배열은 컨텍스트를 생성자로 사용할 수 있습니다.

비고 2 기능은 의도적으로 일반적인 공장 방법이다. 이 값이 Array 생성자 일 필요는 없습니다. 따라서 단일 숫자 인수로 호출 될 수있는 다른 생성자로 전송되거나 상속 될 수 있습니다.

따라서 Array.of()함수에 바인딩 하고 객체와 같은 배열을 생성 할 수 있습니다 .

function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);

Array.of() 하나 를 사용 하면 배열 서브 클래 싱을 수행 할 수도 있습니다 .


3

당신이 사용할 수있는 경우 Map또는 Object.assign, 그것은 매우 간단합니다.

배열을 만듭니다.

const languages = ['css', 'javascript', 'php', 'html'];

아래는 인덱스를 키로 사용하여 객체를 만듭니다.

Object.assign({}, languages)

지도에서 위와 동일하게 복제

인덱스 기반 객체 {0 : 'css'}등 으로 변환합니다 .

const indexMap = new Map(languages.map((name, i) => [i, name] ));
indexMap.get(1) // javascript

값 기반 객체 {css : 'css is great'}등 으로 변환 ...

const valueMap = new Map(languages.map(name => [name, `${name} is great!`] ));
valueMap.get('css') // css is great

3

항목의 배열을 객체로 빠르게 변환하는 간단하고 건방진 방법

function arrayToObject( srcArray ){
    return  JSON.parse( JSON.stringify( srcArray ) );
}

그런 다음 그렇게 사용하십시오 ...

var p = [0,2,3,'pork','pie',6];
obj = new arrayToObject( p );
console.log( obj[3], obj[4] )
// expecting `pork pie`

산출:

pork pie

유형 확인 :

typeof obj
"object"

프로토 타입 방법이 없다면 완벽하지 않을 것입니다

Array.prototype.toObject =function(){
    return  JSON.parse( JSON.stringify( this ) );
}

같은 사용 :

var q = [0,2,3,'cheese','whizz',6];
obj = q.toObject();
console.log( obj[3], obj[4] )
// expecting `cheese whizz`

산출:

cheese whizz

* 네이밍 루틴이 없으므로 특정 이름을 사용하려면 아래의 기존 방법을 계속 사용해야합니다.


이전 방법

이를 통해 원하는 순서대로 키를 정의한 객체를 배열에서 생성 할 수 있습니다.

Array.prototype.toObject = function(keys){
    var obj = {};
    var tmp = this; // we want the original array intact.
    if(keys.length == this.length){
        var c = this.length-1;
        while( c>=0 ){
            obj[ keys[ c ] ] = tmp[c];
            c--;
        }
    }
    return obj;
};

result = ["cheese","paint",14,8].toObject([0,"onion",4,99]);

console.log(">>> :" + result.onion); "paint"를 출력 할 경우, 함수는 길이가 같은 배열을 가지거나 빈 객체를 얻게됩니다.

다음은 업데이트 된 방법입니다

Array.prototype.toObject = function(keys){
    var obj = {};
    if( keys.length == this.length)
        while( keys.length )
            obj[ keys.pop() ] = this[ keys.length ];
    return obj;
};

이것은 키 배열 내용과 내부 주석에도 불구하고 값 배열 (내용)을 모두 파괴합니다. JavaScript는 객체 / 배열의 속성을 참조하여 자동으로 작동하는 JavaScript를 통해 PHP와 다르게 작동합니다.
Brett Zamir

그렇지 않습니다. 루틴은 사본을 만들고 원본은 건드리지 않습니다.
Mark Giblin

예, 원본을 터치했습니다. jsfiddle.net/bRTv7을 참조하십시오 . 배열 길이는 모두 0이됩니다.
Brett Zamir

좋아, 내가 방금 변경 한 편집 된 버전은 배열을 파괴하지 않으며, 그렇게해야한다는 이상한 것을 발견하십시오.
Mark Giblin

1
JSON이 ECMA가 새로운 코드 기능을 추가 한 것보다 오래 걸리기 때문에 구형 브라우저에서 지원되어야하는 업데이트 된 방법
Mark Giblin

2

let i = 0;
let myArray = ["first", "second", "third", "fourth"];

const arrayToObject = (arr) =>
    Object.assign({}, ...arr.map(item => ({[i++]: item})));

console.log(arrayToObject(myArray));

또는 사용

myArray = ["first", "second", "third", "fourth"]
console.log({...myArray})


2

ES5-솔루션 :

사용 배열 프로토 타입 기능 '푸시''적용' 당신이 배열 요소와 객체를 채울 수 있습니다.

var arr = ['a','b','c'];
var obj = new Object();
Array.prototype.push.apply(obj, arr);
console.log(obj);    // { '0': 'a', '1': 'b', '2': 'c', length: 3 }
console.log(obj[2]); // c


내가로 변환 할 경우{ name: a, div :b, salary:c}
Prashant Pimpale

2

더 많은 브라우저를 지원 하고 더 유연한 방법은 다음과 같은 일반 루프를 사용하는 것입니다.

const arr = ['a', 'b', 'c'],
obj = {};

for (let i=0; i<arr.length; i++) {
   obj[i] = arr[i];
}

그러나 현대적인 방법은 다음 과 같이 스프레드 연산자를 사용할 수 있습니다 .

{...arr}

또는 Object assign :

Object.assign({}, ['a', 'b', 'c']);

둘 다 반환합니다 :

{0: "a", 1: "b", 2: "c"}

1

다음과 같은 기능을 사용할 수 있습니다.

var toObject = function(array) {
    var o = {};
    for (var property in array) {
        if (String(property >>> 0) == property && property >>> 0 != 0xffffffff) {
            o[i] = array[i];
        }
    }
    return o;
};

이것은 희소 배열을보다 효율적으로 처리해야합니다.


1

coffeescript의 해결책은 다음과 같습니다.

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj

7
커피 스크립트 란 무엇입니까? 우리는 JS에 대해 이야기하고 있습니다! : D
m93a

2
JavaScript로 컴파일되는 작은 언어입니다 :)
David

6
흠, 이상한 표기법을 사용합니다. 나는 평범한 JS를 더 좋아합니다.
m93a

2
@David 한 줄에서 전체 for 루프를 수행하여 모든 것을 3 줄로 만들 수 있습니다. :) 예 :obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I-
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.