Chuyển đổi mảng thành đối tượng


514

Cách tốt nhất để chuyển đổi là gì:

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

đến:

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

3
Có lẽ những gì anh ta cần là cho một số mã gõ vịt không nghĩ rằng đó là một phiên bản Array
Pointy

6
Giá trị của nó chỉ ra rằng các mảng Javascript các đối tượng.
Spudley

Nếu bất cứ ai khác đang tìm kiếm một giải pháp Lodash, hãy xem xét _.keyBy(trước đây _.indexBy): lodash.com/docs#keyBy
2540625

Điều này hơi khó hiểu vì các mảng đã là đối tượng, nhưng tôi đoán rằng điểm của câu hỏi là chuyển đổi đối tượng kỳ lạ mảng thành một đối tượng bình thường .
Oriol

1
Một cách đơn giản để làm điều này với Lodash là _.toPlainObject. Vd:var myObj = _.toPlainObject(myArr)
Julian Soro

Câu trả lời:


473

ECMAScript 6 giới thiệu dễ dàng đa dạng Object.assign:

Các Object.assign()phương pháp được sử dụng để sao chép các giá trị của tất cả các thuộc tính riêng đếm được từ một hoặc nhiều đối tượng nguồn cho một đối tượng mục tiêu. Nó sẽ trả về đối tượng đích.

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

lengthThuộc tính riêng của mảng không được sao chép vì nó không thể đếm được.

Ngoài ra, bạn có thể sử dụng cú pháp lây lan ES6 để đạt được kết quả tương tự:

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

Chỉ muốn chỉ ra - nếu bạn đã có một mảng các thuộc tính được sắp xếp từ đối tượng ban đầu, sử dụng toán tử trải là điều sẽ biến mảng đó trực tiếp thành một đối tượng mới:{ ...[sortedArray]}
HappyHands31 26/07/19

Oriol, có cách nào để đặt khóa cố định thay vì 0 & 1 không?
Menai Ala Eddine

488

Với chức năng như thế này:

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

Mảng của bạn đã ít nhiều chỉ là một đối tượng, nhưng các mảng có một số hành vi "thú vị" và đặc biệt đối với các thuộc tính có tên nguyên. Ở trên sẽ cung cấp cho bạn một đối tượng đơn giản.

chỉnh sửa oh, bạn cũng có thể muốn chiếm "lỗ hổng" trong mảng:

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

Trong thời gian chạy JavaScript hiện đại, bạn có thể sử dụng .reduce()phương thức:

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

Cái đó cũng tránh được "lỗ hổng" trong mảng, bởi vì đó là cách nó .reduce()hoạt động.


2
@ m93a nó đã là một đối tượng. Trong JavaScript, thực sự không có điểm nào tạo ra một cá thể Mảng ( []) nếu bạn sẽ không sử dụng các khóa thuộc tính số và thuộc tính "độ dài".
Mũi nhọn

14
cách sạch hơn để tránh tái chỉ định paramconst obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
huygn

3
Mũi tên + cú pháp phá hủy không trả lại rõ ràng:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib

2
@eugene_sunic thực sự, nhưng cách tiếp cận đó không có sẵn khi tôi trả lời điều này vào năm 2010 :)
Pointy

2
Như @miro chỉ ra, việc tạo một đối tượng mới mỗi lần là không cần thiết và trên thực tế chậm hơn nhiều so với thao tác với đối tượng ban đầu đã được tạo. Chạy thử nghiệm JSPerf trên một mảng gồm 1000 phần tử, tạo một đối tượng mới mỗi lần chậm hơn 1.000 lần so với việc làm biến đổi đối tượng hiện có. jsperf.com/ Quảng cáo
romellem

281

Bạn có thể sử dụng một tích lũy aka 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"

Vượt qua một đối tượng trống {}làm điểm bắt đầu; sau đó "gia tăng" đối tượng đó tăng dần. Vào cuối các lần lặp, resultsẽ{"0": "a", "1": "b", "2": "c"}

Nếu mảng của bạn là một tập hợp các đối tượng cặp khóa-giá trị:

[{ 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;
}, {});

sẽ sản xuất: {a: 1, b: 2, c: 3}

Để hoàn thiện, reduceRightcho phép bạn lặp lại mảng của mình theo thứ tự ngược lại:

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

sẽ sản xuất: {c:3, b:2, a:1}

Tích lũy của bạn có thể là bất kỳ loại cho mục đích cụ thể của bạn. Ví dụ: để trao đổi khóa và giá trị của đối tượng của bạn trong một mảng, hãy vượt qua []:

[{ 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

sẽ sản xuất: [{1: "a"}, {2: "b"}, {3: "c"}]

Không giống như map, reducecó thể không được sử dụng như một ánh xạ 1-1. Bạn có toàn quyền kiểm soát các mục bạn muốn bao gồm hoặc loại trừ. Do đó, reducecho phép bạn đạt được những gì filterlàm, điều này làm cho reducerất linh hoạt:

[{ 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

sẽ sản xuất: [{2: "b"}, {3: "c"}]

Chú ý : reduceObject.keylà một phần của ECMA 5th edition; bạn nên cung cấp một polyfill cho các trình duyệt không hỗ trợ chúng (đặc biệt là IE8).

Xem một triển khai mặc định của Mozilla .


1
Hữu ích với việc duy trì cửa hàng redux khi bạn đang sử dụng bản đồ của các đối tượng và bạn cần bỏ một trong các khóa
dhruvpatel

101

Nếu bạn đang sử dụng jquery:

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

4
Thật kỳ lạ, nếu tôi đưa ra một biến Array, nó đặt mỗi ký tự vào một đối tượng riêng biệt: 0: "a", 1: ",", 2: "b" ... Vì vậy, nó bỏ qua dấu ngoặc kép, nhưng bao gồm dấu phẩy .. .
TrySpace

@Max Tôi nghĩ không có hành vi như vậy. Đối tượng trả về là {0: 'a', 1: 'b', 2: 'c'}kết quả mong đợi.
ivkremer

3
Có cách nào để sử dụng $ .extend trong khi cũng thông báo cho các khóa theo cách không phải là số, nghĩa là: thực hiện các phép tính trên các mục mảng?
Davi Lima

bài kiểm tra siêu khủng và ngắn
Faisal Mehmood Awan

63

Để đầy đủ, ECMAScript 2015 (ES6) lan rộng. Sẽ yêu cầu bộ chuyển mã (Babel) hoặc môi trường chạy ít nhất ES6.

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


2
Trên thực tế, điều này thực sự không có sẵn trong ES2015. Nó rất thanh lịch tuy nhiên.
Aluan Haddad

47

Có lẽ tôi sẽ viết nó theo cách này (vì rất hiếm khi tôi không có thư viện gạch dưới trong tay):

var _ = require('underscore');

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

9
bạn downvote phản ứng của tôi, nhưng không có bình luận? Câu trả lời của tôi là chính xác và thử nghiệm. Sự phản đối là gì?
Dave Dopson

14
Câu hỏi này không có thẻ gạch dưới và bạn cũng đang giả sử node.js hoặc thư viện yêu cầu.
David Hellsing

10
gạch dưới là khá phổ biến trên cả máy khách và máy chủ. Nó được giả định cho Backbone.js và có lẽ là thư viện tiện ích phổ biến nhất. Điều đó đang được nói, tôi đã bao gồm dòng yêu cầu để làm rõ rằng tôi đang sử dụng một thư viện. Không có 1 lớp lót để mô tả "thêm underscore.js vào trang của bạn", do đó, một số bản dịch được yêu cầu cho môi trường trình duyệt
Dave Dopson

6
Tuy nhiên, nếu bạn đang sử dụng undserscore, một đơn giản obj=_.extend({},a);sẽ thực hiện công việc. Ngoài ra, nếu bạn đang lặp qua các mảng tôi sẽ nói _.eachlà phù hợp hơn _.map. Nói chung, đây không phải là một câu trả lời tốt ở nhiều cấp độ.
David Hellsing

4
Những người "bạn phải trả lời mà không đề cập đến gạch dưới hoặc lo-dash" rất khó chịu. Có thể so sánh với việc bạn phải trả lời các câu hỏi của C ++ mà không đề cập đến các thư viện chuẩn. Nếu gạch dưới hoặc lo-dash không phải là một tùy chọn, OP nên đề cập đến điều đó.
Charlie Martin

26

Đây là một phương pháp O (1) ES2015 chỉ để hoàn thiện.

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) Theo MDN , thay đổi [[Nguyên mẫu]] của một đối tượng là một hoạt động rất chậm. (2) Điều này không loại bỏ lengthtài sản riêng . (3) Đối tượng vẫn là một mảng , Array.isArray(arr) === true. (4) Các hành vi mảng đặc biệt không bị xóa, ví dụ: arr.length = 0xóa tất cả các chỉ mục. (5) Do đó, tôi nghĩ Object.assignlà tốt hơn nhiều .
Oriol

1
@Oriol mdn đã sai, ít nhất là trong động cơ V8 (nhưng cũng là các động cơ khác), đây là một hoạt động khá nhanh trong trường hợp cụ thể này - vì các đối tượng có một cửa hàng số dù sao điều này về cơ bản là thay đổi hai con trỏ.
Benjamin Gruenbaum

Điều này cũng có thể được sử dụng cho thực tế là nó rõ ràng là duy nhất trong số các giải pháp nhanh khác, bảo toàn mọi thuộc tính không chỉ mục ("riêng") trên mảng (nghĩa là các thuộc tính không nguyên dương) ...
Brett Zamir

Nhưng hmm, Array.isArrayđang quay lại true"đối tượng" ở đây mặc dù instanceof Arraykhông ...
Brett Zamir

@BrettZamir nghe có vẻ như một con bọ: D
Benjamin Gruenbaum

26

Ngạc nhiên không thấy -

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


Bất kỳ đề xuất thông minh nào để tạo { "first":"a", "second":"b","third":"c" }với các khóa được cố định - Tôi đang tìm kiếm một sự phá hủy
mplungjan

@mplungjan Tôi sẽ đề nghị sử dụng giảm thay vì gán trong trường hợp đó. Có lẽ có một thư viện cho phép bạn liệt kê trên mọi thứ tự nếu cần thiết.
Wylliam Judd

Tôi đã có một trường hợp khác ngày hôm nay.
Cuối

23

chúng ta có thể sử dụng Object.assignarray.reducechức năng để chuyển đổi một Array thành Object.

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

console.log(newObj)


Đây là những gì tôi đang tìm kiếm. Tôi không cần phân, tôi cần chuyển mảng thành các cặp khóa-giá trị được giữ lại.
Mike K

18

Tôi đã kết thúc bằng cách sử dụng toán tử trải rộng đối tượng, vì nó là một phần của tiêu chuẩn ECMAScript 2015 (ES6).

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

Thực hiện các fiddle sau đây là một ví dụ.


1
Tôi không chắc chắn về hiệu suất của việc này, nhưng trong số rất nhiều chuyển đổi Array sang Object (vì tôi muốn sử dụng các đối tượng cho tất cả các mã của mình để chuẩn hóa nó), đây có lẽ là cách dễ nhất.
Ai đó đặc biệt

Làm thế nào là điều này tốt hơn bất kỳ câu trả lời đã có sẵn mà đưa ra giải pháp rất giống nhau?
Dan Dascalescu

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

Cách dễ dàng trong JavaScript hiện đại là sử dụng Object.assign()không có gì ngoài việc sao chép khóa: giá trị từ đối tượng này sang đối tượng khác. Trong trường hợp của chúng tôi, Arraytặng tài sản cho mới {}.


Làm thế nào là điều này tốt hơn bất kỳ câu trả lời đã có sẵn mà đưa ra giải pháp rất giống nhau?
Dan Dascalescu

Dan Dascalescu tại thời điểm tôi đã thêm câu trả lời, chỉ có câu trả lời ở trên O.assignnhưng nó thiếu lời giải thích. Ngày nay, việc phá hủy mảng thành đối tượng là một cách ( {...array})
Appeiron

13

Đối với ES2016, toán tử trải cho các đối tượng. Lưu ý: Đây là sau ES6 và do đó, bộ chuyển mã sẽ cần được điều chỉnh.

const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"} 


Câu trả lời của nhà điều hành lây lan đã được đưa ra 2 năm trước đó .
Dan Dascalescu

11

Năm năm sau, có một cách tốt :)

Object.assign đã được giới thiệu trong ECMAScript 2015.

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

10

Sử dụng javascript#forEachmột người có thể làm điều này

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

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

Với ECMA6:

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

10

FWIW, một cách tiếp cận gần đây khác là sử dụng cái mới Object.fromEntriescùng với Object.entriesnhư sau:

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

... cho phép tránh lưu trữ các mục mảng thưa thớt dưới dạng undefinedhoặc nullbảo tồn các khóa không chỉ mục (ví dụ: các khóa không nguyên dương / không số).

Người ta có thể muốn thêm arr.length, tuy nhiên, vì điều đó không được bao gồm:

obj.length = arr.length;

9

bạn có thể sử dụng toán tử trải

x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}

1
Câu trả lời này đã được đưa ra nhiều lần.
Dan Dascalescu

9

Nếu bạn đang sử dụng ES6, bạn có thể sử dụng Object.assign và toán tử trải rộng

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

Nếu bạn có mảng lồng nhau như

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

1
Không chỉ các tên biến của bạn khác nhau, mà ví dụ của bạn sẽ không hoạt động, việc tạo bản đồ từ hàm tạo ban đầu yêu cầu Mảng khóa-giá trị 2d. new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins

5

Một cách nhanh chóng và bẩn thỉu:

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

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

Tôi nghĩ rằng bạn đã quên kiểm tra điều đó; nó tạo ra {0:"c", 1:"b", 2:"a"}. Bạn có thể muốn unshiftthay vì pophoặc (tốt hơn) bắt đầu bằng i=arr.length-1và giảm dần thay thế.
Phrogz

vâng .. chỉ thay đổi nó, nhưng sau đó nó trở nên ít thú vị hơn: /
Mic

Thậm chí có thể làm l = arr.length, và sau đó while (l && (obj[--l] = arr.pop())){}(tôi nhận ra điều này đã cũ, nhưng tại sao không đơn giản hóa nó hơn nữa).
Qix - MONICA ĐƯỢC PHÂN PHỐI

2
@Qix, Rút ngắn tốt đẹp
Mic

4

Nhanh và bẩn # 2:

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

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

Tại sao bạn sử dụng ký hiệu dấu phẩy?
Conner Ruhl

3
Sở thích cá nhân để có dấu phẩy dẫn đầu trên dòng tiếp theo. Tôi thấy ký hiệu này dễ đọc hơn.
BingeBoy

1
Vòng lặp sẽ dừng nếu mảng chứa giá trị giả. Bạn nên kiểm tra i < a.lengththay vì a[i].
Oriol

4

Kể từ Lodash 3.0.0, bạn có thể sử dụng _.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

Đây là một hàm đệ quy tôi vừa viết. Nó đơn giản và hoạt động tốt.

// 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;
}

Đây là một ví dụ ( 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));

Các kết quả: Mảng đệ quy cho đối tượng


Hoạt động thực sự tốt. Cảm ơn
Hanmasazaki

Điều này nên cao hơn, nếu bạn có ['a' = '1', 'b' = '2', 'c' = '3']và muốn nó như thế {a: 1, b: 2, c: 3}này hoạt động hoàn hảo.
Wanjia

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

[tài liệu]

hoặc dài dòng hơn

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

hoặc là

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

ngắn nhất với vanilla JS

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

một số ví dụ phức tạp hơn

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

thậm chí ngắn hơn (bằng cách sử dụng 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 ] }

[/ tài liệu]


Bạn đã có ý định [/docs]gì? Nó sẽ hữu ích hơn để làm cho các đoạn mã thực thi.
Dan Dascalescu

3

Tôi sẽ làm điều này đơn giản với Array.of(). Mảng có khả năng sử dụng bối cảnh của nó như là một hàm tạo.

CHÚ THÍCH 2 Hàm số là một phương pháp nhà máy chung có chủ ý; nó không yêu cầu giá trị này của nó là hàm tạo Array. Do đó, nó có thể được chuyển đến hoặc kế thừa bởi các hàm tạo khác có thể được gọi với một đối số số duy nhất.

Vì vậy, chúng tôi có thể liên kết Array.of()với một chức năng và tạo ra một mảng như đối tượng.

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

Bằng cách sử dụng, Array.of() người ta thậm chí có thể thực hiện phân lớp mảng .


3

Nếu bạn có thể sử dụng Maphoặc Object.assign, nó rất dễ dàng.

Tạo một mảng:

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

Dưới đây tạo một đối tượng với chỉ mục là khóa:

Object.assign({}, languages)

Sao chép giống như trên với Bản đồ

Chuyển đổi thành một đối tượng dựa trên chỉ mục, {0 : 'css'}v.v ...

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

Chuyển đổi thành một đối tượng dựa trên giá trị, {css : 'css is great'}v.v ...

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

3

Một phương pháp đơn giản và táo bạo để nhanh chóng chuyển đổi một mảng các mục thành đối tượng

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

Sau đó sử dụng nó như vậy ...

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

Đầu ra:

pork pie

Kiểm tra loại:

typeof obj
"object"

VÀ mọi thứ sẽ không hoàn thành nếu không có phương pháp nguyên mẫu

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

Sử dụng như:

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

Đầu ra:

cheese whizz

* LƯU Ý rằng không có thói quen đặt tên, vì vậy nếu bạn muốn có tên cụ thể, thì bạn sẽ cần tiếp tục sử dụng các phương thức hiện có bên dưới.


Phương pháp cũ hơn

Điều này cho phép bạn tạo từ một mảng một đối tượng với các khóa bạn xác định theo thứ tự bạn muốn chúng.

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); sẽ xuất ra "paint", hàm phải có các mảng có độ dài bằng nhau hoặc bạn nhận được một đối tượng trống.

Đây là một phương pháp cập nhật

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

Điều này phá hủy cả nội dung mảng khóa và, mặc dù nhận xét bên trong, cũng là mảng giá trị (nội dung của nó). JavaScript hoạt động khác với PHP với JavaScript tự động hành động bằng cách tham chiếu đến các thuộc tính của một đối tượng / mảng.
Brett Zamir

Không, không, thói quen tạo ra các bản sao, bản gốc không được chạm vào.
Đánh dấu Giblin

Vâng, bản gốc được chạm vào. Xem jsfiddle.net/bRTv7 . Độ dài mảng kết thúc cả hai là 0.
Brett Zamir

Ok, phiên bản chỉnh sửa tôi vừa thay đổi nó không phá hủy các mảng, thấy lạ là nó nên làm điều đó.
Đánh dấu Giblin

1
Phương pháp cập nhật nên được hỗ trợ trong các trình duyệt cũ hơn vì JSON đã tồn tại lâu hơn ECMA đã thêm các tính năng mã mới
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));

Hoặc dùng

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


2

ES5 - Giải pháp:

Sử dụng chức năng nguyên mẫu mảng 'đẩy''áp dụng', bạn có thể điền đối tượng với các thành phần mảng.

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


Điều gì sẽ xảy ra nếu tôi muốn chuyển đổi thành{ name: a, div :b, salary:c}
Prashant Pimpale

2

Nhiều trình duyệt được hỗ trợ và cách làm linh hoạt hơn đó là sử dụng một vòng lặp bình thường , đại loại như:

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

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

Nhưng cũng là cách hiện đại có thể sử dụng toán tử trải rộng , như:

{...arr}

Hoặc gán đối tượng :

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

Cả hai sẽ trở lại :

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

1

Bạn có thể sử dụng một chức năng như thế này:

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;
};

Điều này sẽ xử lý các mảng thưa thớt hiệu quả hơn.


1

Đây là một giải pháp trong coffeescript

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

7
Cà phê là gì? Chúng ta đang nói về JS! : D
m93a

2
Đó là một ngôn ngữ nhỏ biên dịch thành JavaScript :)
David

6
Hừm, nó dùng ký hiệu lạ. Tôi thích JS đơn giản hơn.
m93a

2
@David Bạn có thể thực hiện toàn bộ vòng lặp for trên 1 dòng để làm cho toàn bộ chỉ có 3 dòng. :) Ví dụ:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.