如何将键值元组数组转换为对象

IT技术 javascript arrays
2021-02-18 04:18:51

我有一个数组:

[ [ '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如何将上述元组数组转换为对象,以便我可以轻松地通过键访问数据。

6个回答

2020 年更新:正如baao 指出的那样Object.fromEntries(arr)现在在所有现代浏览器上都这样做。


您可以使用Object.assign展开运算符解构赋值map代替@royhowie's 的方法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)

计算属性名称也用于{[d[0]]: d[1]}:)
2021-04-21 04:18:51
Object.assign.apply(null, arr.map(([key, val]) => { return { [key]: val } })) 更容易阅读和理解(当扩展到多行时)。
2021-04-23 04:18:51
点是什么...?
2021-04-24 04:18:51
一个类似的单行(带reduce),其优点是更易于链接: arr.reduce((obj, d) => Object.assign(obj, {[d[0]]: d[1]}), {})
2021-04-29 04:18:51
Object.assign(...array.map( ([key, val]) => ({ [key]: val }) )) —@Toph 的回答和@royhowie 的评论的整合。
2021-05-03 04:18:51

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


甚至是“减少”方法的答案
2021-04-21 04:18:51
看起来下面的新 Map(array) 解决方案更简单
2021-05-13 04:18:51

更惯用的方法是使用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
}, {})
避免参数重新分配的更干净的方法 const obj = arr.reduce((obj, [ key, value ]) => { return { ...obj, [key]: value }; }, {});
2021-05-09 04:18:51
甚至避免使用 return 语句: const obj = arr.reduce(obj, [key, value] => ({ ...obj, [key]: value }), {})
2021-05-17 04:18:51

使用地图

new Map(array);

Map 对象保存键值对并记住键的原始插入顺序。任何值(对象和原始值)都可以用作键或值。

这是有效的,因为您的变量类型arrayArray<[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'));

@PA。typeof new Map() // "object":)
2021-04-24 04:18:51
别这样……太简单了^^
2021-04-29 04:18:51
不确定大多数人在寻找什么,但最初的问题是寻找'2015/08/13 21:50:04'给定属性的值txnDate,我认为这是最语义化的方法。
2021-04-30 04:18:51
@Rick 我在这里很困惑。我只是在控制台中尝试过这个:array = [['a', 1],['b','two'],['c', [3,3,3]]]然后obj = new Map(array);. 但是,obj.aobj['a']都是未定义的。那么这是如何实现目标的呢?
2021-05-15 04:18:51
@RickViscomi——好的。不知道 Map 对象。但是,我会说大多数人正在寻找的是获取常规 JS 对象。
2021-05-15 04:18:51
arr.reduce((o, [key, value]) => ({...o, [key]: value}), {})