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

时间:2015-08-14 04:15:05

标签: 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' ] ]

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

16 个答案:

答案 0 :(得分:72)

您可以使用Object.assignspread operatordestructuring assignment来处理使用map代替@royhowie’s reduce的方法,这可能会或可能不会更多直观的:

Object.assign(...arr.map(([key, val]) => ({[key]: val})))

E.g:



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)




答案 1 :(得分:38)

更惯用的方法是使用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>'))
&#13;
&#13;
&#13;

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

let obj = arr.reduce((o, [ key, value ]) => {
    o[key] = value
    return o
}, {})

答案 2 :(得分:25)

使用Map

new Map(array);

这是有效的,因为变量array的类型为Array<[key,value]>。可以使用数组数组初始化Map构造函数,其中内部数组的第一个元素是键,第二个是值。

&#13;
&#13;
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'));
&#13;
&#13;
&#13;

答案 3 :(得分:22)

这样做:

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

答案 4 :(得分:13)

arr.reduce((o, [key, value]) => ({...o, [key]: value}), {})

答案 5 :(得分:3)

使用以下方法将数组轻松转换为对象。

var obj = {};
array.forEach(function(e){
   obj[e[0]] = e[1]
})

这将使用第一个元素作为键,第二个元素作为每个元素的值。

答案 6 :(得分:2)

采用Airbnb代码风格的短ES6方式

例:

const obj = arr.reduce((prevObj, [key, value]) => ({ ...prevObj, [key]: value }), {});

答案 7 :(得分:1)

最简单的方法是在数组是JSON数据的地方:

value = 12000

答案 8 :(得分:1)

我更推荐你使用ES6完美的Object.assign()方法。

Object.assign({}, ...array.map(([ key, value ]) => ({ [key]: value })));

这里发生了什么 - Object.assign()什么都不做,只需要拿钥匙:来自捐赠对象的价值并将结果放在一起。在这种情况下,我使用...将新的array拆分为多个对(在映射后看起来像[{'cardType':'iDEBIT'}, ... ])。最后,新的{}会从映射的array接收每对中的每个键:属性。

答案 9 :(得分:1)

您可以使用ES6中的数组缩减轻松完成此操作

在这个例子中,我们创建了一个reducer函数并传递一个对象&#39; {}&#39;作为reduce函数的初始值以及reducer

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 10 :(得分:1)

使用.reduce()

的ES5版本
const object = array.reduce(function(accumulatingObject, [key, value]) {
  accumulatingObject[key] = value;
  return accumulatingObject;
}, {});

答案 11 :(得分:1)

为此,新的JS API为Object.fromEntries(array of tuples),它可与原始数组和/或地图一起使用

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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}

答案 14 :(得分:-1)

在我的情况下,所有其他解决方案均无效,但该解决方案有效:

obj = {...arr}

我的arr格式为:[name: "the name", email: "the@email.com"]

答案 15 :(得分:-2)

当我在acc[i] = cur;使用reduce函数时,它返回了一种对象,我需要使用这种方式obj[i].property来访问它。但是使用这种方式,我拥有了我想要的对象,现在我可以像obj.property一样访问它。

 function convertArraytoObject(arr) {
        var obj = arr.reduce(function (acc, cur, i) {
            acc = cur;
            return acc;
        }, {});
        return obj;
    }