[javascript] 배열을 객체로 변환

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

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

에:

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



답변

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

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

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

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

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

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


답변

이 같은 기능으로 :

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()합니다. 그것이 작동 하는 방식 이기 때문입니다 .


답변

어큐뮬레이터 일명 사용할 수 있습니다 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 의 기본 구현을 참조하십시오 .


답변

jquery를 사용하는 경우 :

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


답변

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

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


답변

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

var _ = require('underscore');

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


답변

여기 완전성을위한 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