簡體   English   中英

如何將鍵值元組數組轉換為對象

[英]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)

2020 年 6 月更新

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM