Как преобразовать массив ключей-значений в объект
У меня есть массив:
[ [ '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
. Как преобразовать вышеуказанный массив кортежей в объект, чтобы я мог легко получить доступ к данным по ключу.
Ответы
Ответ 1
Это будет сделано:
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);
Ответ 2
Вы можете использовать Object.assign, оператор распространения и назначение деструктурирования для подхода, который использует map
вместо @royhowies 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)
Ответ 3
Более идиоматическим подходом было бы использовать 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>'))
Ответ 4
Используйте 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'));
Ответ 5
arr.reduce((o, [key, value]) => ({...o, [key]: value}), {})
Ответ 6
используйте следующий способ для простого преобразования массива в объект.
var obj = {};
array.forEach(function(e){
obj[e[0]] = e[1]
})
Это будет использовать первый элемент в качестве ключа, а второй - как значение для каждого элемента.
Ответ 7
Короткий путь ES6 со стилем кода Airbnb
Exemple:
const obj = arr.reduce((prevObj, [key, value]) => ({ ...prevObj, [key]: value }), {});
Ответ 8
Самый простой способ сделать это, где массив данных JSON:
var obj = {};
array.forEach(function(Data){
obj[Data[0]] = Data[1]
})
Ответ 9
Я еще больше рекомендую вам использовать ES6 с его совершенным методом Object.assign()
.
Object.assign({}, ...array.map(([ key, value ]) => ({ [key]: value })));
Что здесь происходит - Object.assign()
ничего не делать, кроме как взять ключ: значение от пожертвования объекта и помещает пару в ваш результат. В этом случае я использую ...
для разделения нового array
на умножение пар (после карты это выглядит как [{'cardType':'iDEBIT'}, ... ]
). Итак, в конце, новый {}
получает каждый ключ: свойство от каждой пары от отображаемого array
.
Ответ 10
Вы можете сделать это легко, используя сокращение массива в ES6
В этом примере мы создаем функцию редуктора и передаем объект '{}' в качестве начального значения функции уменьшения вместе с редуктором
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);
Ответ 11
Версия ES5 с использованием .reduce()
const object = array.reduce(function(accumulatingObject, [key, value]) {
accumulatingObject[key] = value;
return accumulatingObject;
}, {});
Ответ 12
Новый JS API для этого - Object.fromEntries(array of tuples)
, он работает с необработанными массивами и/или картами.
Ответ 13
С 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);
Ответ 14
Когда я использовал функцию уменьшения с acc[i] = cur;
, он возвращал какой-то объект, который мне нужен для доступа к нему, как массив, используя этот способ obj[i].property
. Но используя этот способ, у меня есть Объект, который я хотел, и теперь я могу получить к нему доступ, как obj.property
.
function convertArraytoObject(arr) {
var obj = arr.reduce(function (acc, cur, i) {
acc = cur;
return acc;
}, {});
return obj;
}
Ответ 15
В моем случае все другие решения не работали, но вот это:
obj = {...arr}
мой arr в форме: [name: "the name", email: "[email protected]"]