Cách tốt nhất để chuyển đổi là gì:
['a','b','c']
đến:
{
0: 'a',
1: 'b',
2: 'c'
}
_.keyBy
(trước đây _.indexBy
): lodash.com/docs#keyBy
_.toPlainObject
. Vd:var myObj = _.toPlainObject(myArr)
Cách tốt nhất để chuyển đổi là gì:
['a','b','c']
đến:
{
0: 'a',
1: 'b',
2: 'c'
}
_.keyBy
(trước đây _.indexBy
): lodash.com/docs#keyBy
_.toPlainObject
. Vd:var myObj = _.toPlainObject(myArr)
Câu trả lời:
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"}
length
Thuộ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'] }
{ ...[sortedArray]}
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.
[]
) 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".
const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
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, result
sẽ{"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, reduceRight
cho 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
, reduce
có 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 đó, reduce
cho phép bạn đạt được những gì filter
làm, điều này làm cho reduce
rấ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ú ý : reduce
và Object.key
là 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 .
Nếu bạn đang sử dụng jquery:
$.extend({}, ['a', 'b', 'c']);
{0: 'a', 1: 'b', 2: 'c'}
kết quả mong đợi.
Để đầ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'] }
)
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' }
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 _.each
là 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 độ.
Đâ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
length
tà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 = 0
xóa tất cả các chỉ mục. (5) Do đó, tôi nghĩ Object.assign
là tốt hơn nhiều .
Array.isArray
đang quay lại true
"đối tượng" ở đây mặc dù instanceof Array
không ...
Ngạc nhiên không thấy -
console.log(
Object.assign({}, ['a', 'b', 'c'])
)
{ "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
chúng ta có thể sử dụng Object.assign
và array.reduce
chứ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)
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ụ.
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, Array
tặng tài sản cho mới {}
.
O.assign
như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}
)
Đố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"}
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'}
Sử dụng javascript#forEach
mộ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);
FWIW, một cách tiếp cận gần đây khác là sử dụng cái mới Object.fromEntries
cùng với Object.entries
như 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 undefined
hoặc null
bả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;
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}
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]})))
new Map([['key1', 'value1'], ['key2', 'value2']]);
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() ) ){};
{0:"c", 1:"b", 2:"a"}
. Bạn có thể muốn unshift
thay vì pop
hoặc (tốt hơn) bắt đầu bằng i=arr.length-1
và giảm dần thay thế.
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).
Nhanh và bẩn # 2:
var i = 0
, s = {}
, a = ['A', 'B', 'C'];
while( a[i] ) { s[i] = a[i++] };
i < a.length
thay vì a[i]
.
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>
Đâ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ả:
['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.
.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]
[/docs]
gì? Nó sẽ hữu ích hơn để làm cho các đoạn mã thực thi.
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 .
Nếu bạn có thể sử dụng Map
hoặ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
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;
};
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})
ES5 - Giải pháp:
Sử dụng chức năng nguyên mẫu mảng 'đẩy' và 'á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
{ name: a, div :b, salary:c}
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"}
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.
Đây là một giải pháp trong coffeescript
arrayToObj = (arr) ->
obj = {}
for v,i in arr
obj[i] = v if v?
obj
obj[i] = v for v,i in arr when v?