배열을 객체로 변환


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"}]

주의 : reduce및 Object.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.