我有一个数组:
[ [ '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
。如何将上面的元组数组转换为对象,以便我可以通过键轻松访问数据。
答案 0 :(得分:72)
您可以使用Object.assign,spread operator和destructuring 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;
使用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
构造函数,其中内部数组的第一个元素是键,第二个是值。
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;
答案 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
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;
答案 10 :(得分:1)
使用.reduce()
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;
}