![](/img/trans.png)
[英]How to convert an array into an object in javascript with mapped key-value pairs?
[英]How to convert an array of key-value tuples into an object
我有一個數組:
[ [ 'cardType', 'iDEBIT' ],
[ 'txnAmount', '17.64' ],
[ 'txnId', '20181' ],
[ 'txnType', 'Purchase' ],
[ 'txnDate', '2015/08/13 21:50:04' ],
[ 'respCode', '0' ],
[ 'isoCode', '0' ],
[ 'authCode', '' ],
[ 'acquirerInvoice', '0' ],
[ 'message', '' ],
[ 'isComplete', 'true' ],
[ 'isTimeout', 'false' ] ]
但我無法通過數組的鍵訪問數據,例如arr['txnId']
不返回20181
。 如何將上面的元組數組轉換為對象,以便可以輕松地按鍵訪問數據。
2020 年更新:正如baao 所指出的, Object.fromEntries(arr)
現在可以在所有現代瀏覽器上執行此操作。
您可以使用Object.assign 、 擴展運算符和解構賦值來實現使用map
而不是@royhowie 的reduce
,這可能更直觀,也可能不更直觀:
Object.assign(...arr.map(([key, val]) => ({[key]: val})))
例如:
var arr = [ [ 'cardType', 'iDEBIT' ], [ 'txnAmount', '17.64' ], [ 'txnId', '20181' ], [ 'txnType', 'Purchase' ], [ 'txnDate', '2015/08/13 21:50:04' ], [ 'respCode', '0' ], [ 'isoCode', '0' ], [ 'authCode', '' ], [ 'acquirerInvoice', '0' ], [ 'message', '' ], [ 'isComplete', 'true' ], [ 'isTimeout', 'false' ] ] var obj = Object.assign(...arr.map(([key, val]) => ({[key]: val}))) console.log(obj)
ECMAScript 2021 帶來了符合要求的Object.fromEntries
:
const array = [ [ 'cardType', 'iDEBIT' ], [ 'txnAmount', '17.64' ], [ 'txnId', '20181' ], [ 'txnType', 'Purchase' ], [ 'txnDate', '2015/08/13 21:50:04' ], [ 'respCode', '0' ], [ 'isoCode', '0' ], [ 'authCode', '' ], [ 'acquirerInvoice', '0' ], [ 'message', '' ], [ 'isComplete', 'true' ], [ 'isTimeout', 'false' ] ]; const obj = Object.fromEntries(array); console.log(obj);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries
這將做到:
const array = [ [ 'cardType', 'iDEBIT' ], [ 'txnAmount', '17.64' ], [ 'txnId', '20181' ], [ 'txnType', 'Purchase' ], [ 'txnDate', '2015/08/13 21:50:04' ], [ 'respCode', '0' ], [ 'isoCode', '0' ], [ 'authCode', '' ], [ 'acquirerInvoice', '0' ], [ 'message', '' ], [ 'isComplete', 'true' ], [ 'isTimeout', 'false' ] ]; var obj = {}; array.forEach(function(data){ obj[data[0]] = data[1] }); console.log(obj);
更慣用的方法是使用Array.prototype.reduce
:
var arr = [ [ 'cardType', 'iDEBIT' ], [ 'txnAmount', '17.64' ], [ 'txnId', '20181' ], [ 'txnType', 'Purchase' ], [ 'txnDate', '2015/08/13 21:50:04' ], [ 'respCode', '0' ], [ 'isoCode', '0' ], [ 'authCode', '' ], [ 'acquirerInvoice', '0' ], [ 'message', '' ], [ 'isComplete', 'true' ], [ 'isTimeout', 'false' ] ]; var obj = arr.reduce(function (o, currentArray) { var key = currentArray[0], value = currentArray[1] o[key] = value return o }, {}) console.log(obj) document.write(JSON.stringify(obj).split(',').join(',<br>'))
當使用 ES6 ( 剩余參數) 語法完成時,這更具視覺吸引力:
let obj = arr.reduce((o, [ key, value ]) => {
o[key] = value
return o
}, {})
使用地圖。
new Map(array);
Map 對象保存鍵值對並記住鍵的原始插入順序。 任何值(對象和原始值)都可以用作鍵或值。
這是有效的,因為您的變量array
的類型是Array<[key,value]>
。 Map
構造函數可以使用數組數組進行初始化,其中內部數組的第一個元素是鍵,第二個元素是值。
const array = [ ['cardType', 'iDEBIT'], ['txnAmount', '17.64'], ['txnId', '20181'], ['txnType', 'Purchase'], ['txnDate', '2015/08/13 21:50:04'], ['respCode', '0'], ['isoCode', '0'], ['authCode', ''], ['acquirerInvoice', '0'], ['message', ''], ['isComplete', 'true'], ['isTimeout', 'false'] ]; const obj = new Map(array); console.log(obj.get('txnDate'));
arr.reduce((o, [key, value]) => ({...o, [key]: value}), {})
使用Object.fromEntries
,您可以從Array
轉換為Object
:
var entries = [ ['cardType', 'iDEBIT'], ['txnAmount', '17.64'], ['txnId', '20181'], ['txnType', 'Purchase'], ['txnDate', '2015/08/13 21:50:04'], ['respCode', '0'], ['isoCode', '0'], ['authCode', ''], ['acquirerInvoice', '0'], ['message', ''], ['isComplete', 'true'], ['isTimeout', 'false'] ]; var obj = Object.fromEntries(entries); console.log(obj);
使用以下方式輕松將數組轉換為對象。
var obj = {};
array.forEach(function(e){
obj[e[0]] = e[1]
})
這將使用第一個元素作為鍵,第二個元素作為每個元素的值。
使用.reduce()
ES5 版本
const object = array.reduce(function(accumulatingObject, [key, value]) {
accumulatingObject[key] = value;
return accumulatingObject;
}, {});
短 ES6 方式與 Airbnb 代碼風格
示例:
const obj = arr.reduce((prevObj, [key, value]) => ({ ...prevObj, [key]: value }), {});
新的 JS API 是Object.fromEntries(array of tuples)
,它適用於原始數組和/或地圖
在數組包含 JSON 數據的情況下,最簡單的方法是:
var obj = {};
array.forEach(function(Data){
obj[Data[0]] = Data[1]
})
我更推薦你使用 ES6 和它完美的Object.assign()
方法。
Object.assign({}, ...array.map(([ key, value ]) => ({ [key]: value })));
這里發生了什么 - Object.assign()
什么都不做,只是從捐贈對象中獲取 key:value 並將 pair 放入你的結果中。 在這種情況下,我使用...
將新array
拆分為乘對(在 map 之后它看起來像[{'cardType':'iDEBIT'}, ... ]
)。 所以最后, new {}
從映射array
每一對接收每個 key:property。
您可以使用 ES6 中的數組 reduce 輕松完成此操作
在這個例子中,我們創建了一個 reducer 函數,並將一個對象“{}”作為初始值與 reducer 一起傳遞給 reduce 函數
const arr = [ [ 'cardType', 'iDEBIT' ], [ 'txnAmount', '17.64' ], [ 'txnId', '20181' ], [ 'txnType', 'Purchase' ], [ 'txnDate', '2015/08/13 21:50:04' ], [ 'respCode', '0' ], [ 'isoCode', '0' ], [ 'authCode', '' ], [ 'acquirerInvoice', '0' ], [ 'message', '' ], [ 'isComplete', 'true' ], [ 'isTimeout', 'false' ] ]; const reducer = (obj, item) => { obj[item[0]] = item[1]; return obj; }; const result = arr.reduce(reducer, {}); console.log(result);
let obj ={'abc':123,'other':566};
// first way
let coll= Object.entries(obj).map(i=>Object.assign({'key':i[0],'value':i[1]}))
results: coll =>
0: {key: "abc", value: 123}
1: {key: "other", value: 566}
// second way
let coll2= new Map(Object.entries(obj))
results: coll2 =?
//[[Entries]]
0: {"abc" => 123}
1: {"other" => 566}
我有一個數組:
[ [ 'cardType', 'iDEBIT' ],
[ 'txnAmount', '17.64' ],
[ 'txnId', '20181' ],
[ 'txnType', 'Purchase' ],
[ 'txnDate', '2015/08/13 21:50:04' ],
[ 'respCode', '0' ],
[ 'isoCode', '0' ],
[ 'authCode', '' ],
[ 'acquirerInvoice', '0' ],
[ 'message', '' ],
[ 'isComplete', 'true' ],
[ 'isTimeout', 'false' ] ]
但是我無法通過數組的鍵訪問數據,例如arr['txnId']
不返回20181
。 如何將上述元組數組轉換為對象,以便可以輕松地通過鍵訪問數據。
我有一個數組:
[ [ 'cardType', 'iDEBIT' ],
[ 'txnAmount', '17.64' ],
[ 'txnId', '20181' ],
[ 'txnType', 'Purchase' ],
[ 'txnDate', '2015/08/13 21:50:04' ],
[ 'respCode', '0' ],
[ 'isoCode', '0' ],
[ 'authCode', '' ],
[ 'acquirerInvoice', '0' ],
[ 'message', '' ],
[ 'isComplete', 'true' ],
[ 'isTimeout', 'false' ] ]
但是我無法通過數組的鍵訪問數據,例如arr['txnId']
不返回20181
。 如何將上述元組數組轉換為對象,以便可以輕松地通過鍵訪問數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.