![](/img/trans.png)
[英]Is there another way to solve this forEach problem using map, filter, reduce…?
[英]Is there a way to solve this problem by using .forEach or .map instead of for-loop?
我需要編寫一個函數,將數組中的數組元素轉換為對象。 雖然我已經想出了一種通過使用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' }
];
以下是我通過使用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);
您可以使用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);
要獲得預期結果,請使用以下使用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.