Подтвердить что ты не робот

Как преобразовать массив ключей-значений в объект

У меня есть массив:

[ [ '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. Как преобразовать вышеуказанный массив кортежей в объект, чтобы я мог легко получить доступ к данным по ключу.

4b9b3361

Ответ 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]"]