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

Ant*_*ony 45 javascript arrays

我有一个数组:

[ [ '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' ] ]
Run Code Online (Sandbox Code Playgroud)

但我不能通过数组的密钥访问数据,例如arr['txnId']不返回20181.如何将上面的元组数组转换为对象,以便我可以通过键轻松访问数据.

Top*_*oph 78

如果您正在使用ES6,则可以使用Object.assignspread运算符来使用map而不是@ royhowie的reduce,这可能会也可能不会更直观:

Object.assign(...arr.map(([key, val]) => ({[key]: val})))
Run Code Online (Sandbox Code Playgroud)

例如:

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)
Run Code Online (Sandbox Code Playgroud)

  • `Object.assign.apply(null,arr.map(([key,val])=> {return {[key]:val}}))`更容易阅读和理解(当分散到多行时) . (4认同)
  • [计算属性名称](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#New_notations_in_ECMAScript_2015) 也用于 `{[d[0]]: d[1 ]}` :) (2认同)

roy*_*wie 40

更惯用的方法是使用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>'))
Run Code Online (Sandbox Code Playgroud)

使用ES6(rest parameters)语法完成后,这在视觉上更具吸引力:

let obj = arr.reduce((o, [ key, value ]) => {
    o[key] = value
    return o
}, {})
Run Code Online (Sandbox Code Playgroud)

  • 更简洁的方法来避免param重新分配`const obj = arr.reduce((obj,[key,value])=> {return {... obj,[key]:value};},{});` (4认同)

chr*_*con 26

这样做:

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);
Run Code Online (Sandbox Code Playgroud)

  • 看起来下面的新Map(数组)解决方案更直接 (3认同)

Ric*_*omi 26

使用地图.

new Map(array);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为变量的类型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'));
Run Code Online (Sandbox Code Playgroud)

  • 别这样……太简单了^^ (6认同)
  • 不确定大多数人在寻找什么,但最初的问题是在给定属性“txnDate”的情况下寻找值“2015/08/13 21:50:04”,我认为这是最语义化的方法. (4认同)
  • @RickViscomi - 好的。不知道 Map 对象。但是,我会说大多数人正在寻找的是获取常规 JS 对象。 (3认同)

Osw*_*ldo 13

arr.reduce((o, [key, value]) => ({...o, [key]: value}), {})
Run Code Online (Sandbox Code Playgroud)


Pen*_*Liu 8

使用Object.fromEntries,您可以从 转换ArrayObject

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);
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案。 (2认同)