Есть ли способ решить эту проблему, используя .forEach или .map вместо цикла for? - PullRequest
7 голосов
/ 03 апреля 2019

Мне нужно написать функцию, которая преобразует элементы массива в массиве в объекты.Хотя я нашел способ решения проблемы с помощью for-loop, мне просто интересно , есть ли более краткий способ написать решение, используя такие методы, как forEach или map.

Проблема в том, что ...

var array: [
  [
    ['firstName', 'Joe'],
    ['lastName', 'Blow'],
    ['age', 42],
    ['role', 'clerk']
  ],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
];

Мне нужно преобразовать вышеуказанный массив во что-то вроде этого.

[
  { firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk' },
  { firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager' }
];

Ниже приведен код IПридумайте, используя for-loop.

function transformEmployeeData(array)
{  
  var output = [];

  for (var i = 0; i < array.length; i++)
  {
    var obj = {};

    for (var j = 0; j < array[i].length; j++)
    {
      obj[array[i][j][0]] = array[i][j][1];
    }

    output.push(obj);
  }

  return output;
}

Как я уже упоминал выше, было бы здорово, если есть другой способ решения проблемы.

Ответы [ 7 ]

5 голосов
/ 03 апреля 2019

В ближайшем будущем, возможно, вы сможете использовать Object.fromEntries () . Это поддерживается в некоторых версиях браузеров прямо сейчас: Совместимость браузера :

var arr = [
  [
    ['firstName', 'Joe'],
    ['lastName', 'Blow'],
    ['age', 42],
    ['role', 'clerk']
  ],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
];

console.log(arr.map(Object.fromEntries));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
2 голосов
/ 03 апреля 2019

Вы можете сопоставить новые объекты, сопоставив свойства и объединяя все свойства в один объект.

var data = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]],
    result = data.map(a => Object.assign(...a.map(([key, value]) => ({ [key]: value }))));
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 03 апреля 2019

Ваша функция с картой и forEach:

function transformEmployeeData(array) {  
  return array.map(toObject => {
    const obj = {};
    toObject.forEach(([key, value]) => {
      obj[key] = value;
    });
    return obj;
  });
};

var array = [
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
];
    
function transformEmployeeData(array) {  
  return array.map(toObject => {
    const obj = {};
    toObject.forEach(([key, value]) => {
      obj[key] = value;
    });
    return obj;
  });
};

console.log(transformEmployeeData(array));
1 голос
/ 03 апреля 2019

да, вы можете сделать это в одну строку.

var array = [
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
    ];

const transformed = array.map(upperArr => upperArr.reduce((acc, itemArr) => { acc[itemArr[0]] = itemArr[1]; return acc;}, {}));
console.log(transformed);
1 голос
/ 03 апреля 2019

Для достижения ожидаемого результата используйте нижеприведенную опцию использования карты и forEach

var array = [
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
    ];

console.log(array.map(val => {
  const result = {}
  val.forEach(v => {
    result[v[0]] = v[1]
  })
  return result
}))

codepen - https://codepen.io/nagasai/pen/ROWmEX

1 голос
/ 03 апреля 2019

Вы можете использовать map и reduce в тандеме (сопоставить каждый элемент с результатом функции Reduce, которая преобразует каждый элемент в пару ключ / значение):

var array=[[['firstName','Joe'],['lastName','Blow'],['age',42],['role','clerk']],[['firstName','Mary'],['lastName','Jenkins'],['age',36],['role','manager']]];

const result = array.map(e => 
  e.reduce((a, [k, v]) => ((a[k] = v) || 1) && a, {}))
;

console.log(result);
1 голос
/ 03 апреля 2019

Использование карты и уменьшения.

  var array = [
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
    ];

    var transformed = array.map(a=> a.reduce((c, p) => {c[p[0]] = p[1]; return c;},{}));
    console.log(transformed);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...