簡體   English   中英

有沒有辦法通過使用.forEach或.map而不是for-loop來解決這個問題?

[英]Is there a way to solve this problem by using .forEach or .map instead of for-loop?

我需要編寫一個函數,將數組中的數組元素轉換為對象。 雖然我已經想出了一種通過使用for-loop解決問題的方法,但我只是想知道是否有更簡潔的方法來編寫解決方案,使用forEachmap等方法

問題是...

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' }
];

以下是我通過使用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;
}

就像我上面提到的那樣,如果有另一種方法可以解決問題,那將會很棒。

在不久的將來,您可以使用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;} 

您可以通過映射屬性來映射新對象,並將所有屬性連接到單個對象。

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

使用map和reduce。

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

您可以使用mapreduce串聯(將每個元素映射到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); 

要獲得預期結果,請使用以下使用map和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

是的,你可以在一行中完成。

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

你的map和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)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM