我已將基于 CSV 的文本檔案轉換為包含標題和行的陣列,現在我想將它們轉換為以下給定的解決方案。任何人都可以使用類似map的方法reduce或其他方法來做到這一點。
我擁有的陣列是:
let header = ['a', 'b', 'c', 'd'];
let rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];
我想要的結果是:
[{
a: 1,
b: 2,
c: 3,
d: 4,
}, {
a: 5,
b: 6,
c: 7,
d: 8,
}, {
a: 9,
b: 0,
c: 1,
d: 2,
}]
我可以使用 for 回圈來做到這一點,但這不是 es6 的合適解決方案。
上面我提到了一些虛擬陣列,現在實際代碼是:
const recordReader = content => {
let weatherRecords = [];
let rows = content.split('\n');
let headers = rows.shift().split(',');
for (let row = 0; row < rows.length; row ) {
let weatherReading = {};
if (!rows[row]) {
continue;
}
let record = rows[row].split(',');
for (let column = 0; column < headers.length; column ) {
weatherReading[headers[column]] = record[column];
}
weatherRecords.push(weatherReading);
}
return weatherRecords;
};
uj5u.com熱心網友回復:
您可以映射行并將行減少為物件:
const header = ['a', 'b', 'c', 'd'];
const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];
const result = rows.map((row) =>
row.split(',').reduce(
(obj, cell, i) => ({
...obj,
[header[i]]: Number(cell),
}),
{}
)
);
console.log(result)
uj5u.com熱心網友回復:
結合map和reduce:
const header = ['a', 'b', 'c', 'd'];
const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];
const res = rows.map(row => {
const columns = row.split(',');
return columns.reduce( (acc,cur,i) => ({...acc,[header[i]]:cur}) , {})
}
);
console.log(res);
這承認單線,但我認為不是很清楚看到它的作用:
const header = ['a', 'b', 'c', 'd'];
const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];
const res = rows.map(row => row.split(',').reduce( (acc,cur,i) => ({...acc,[header[i]]:cur}) , {}));
console.log(res);
uj5u.com熱心網友回復:
您可以.map()將rows元素轉換為物件。要創建物件,您可以獲取數字字串,并將它們拆分為一個陣列,然后您可以使用該陣列從當前數字的索引中.map()獲取數字值和關聯的標題( )。通過將它們放入對陣列中,您可以呼叫它來構建您的物件。下面還使用一元加號運算子 ( )將您的字串數字轉換為數字:headersi[key, value]Object.fromEntries()
const header = ['a', 'b', 'c', 'd'];
const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];
const res = rows.map(item =>
Object.fromEntries(item.split(',').map((n, i) => [header[i], n]))
);
console.log(res);
注意,上面的用法Object.fromEntries()是在 ES6 之后引入的,你可以用Object.assign()一個 smilar 的方法,也就是 ES6:
顯示代碼片段
const header = ['a', 'b', 'c', 'd'];
const rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];
const res = rows.map(item =>
Object.assign({}, ...item.split(',').map((n, i) => ({[header[i]]: n})))
);
console.log(res);
uj5u.com熱心網友回復:
試試這個代碼
let header = ['a', 'b', 'c', 'd'];
let rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];
let result = rows.map((x) => {
let elementArr = x.split(',');
let response = [];
header.forEach((item,i) => {
response[item] = parseInt(elementArr[i])
});
return {...response};
});
console.log(result)
uj5u.com熱心網友回復:
嘗試這個
let header = ['a', 'b', 'c', 'd'];
let rows = ['1,2,3,4', '5,6,7,8', '9,0,1,2'];
result=[]
rows.forEach(e=>{
let a={};
let i=0;
header.forEach((h)=>{
a[h]=e.split(',')[i ]
});
result.push(a)
});
uj5u.com熱心網友回復:
基于嵌套reduce的方法將完成這項作業。
一個使用外部 reducer 函式迭代 -array,該函式再次通過第二個任務rows迭代每個列值(從每個splitted派生),該任務將列值分配給列鍵,其中每個鍵派生自額外傳遞的-陣列和當前內部迭代的列索引。rowreduceheader
function rowwiseAssignColumValuesToHeaderColumnKeys({ header, result }, row) {
result
.push(
row
.split(',')
.reduce((rowItem, columnValue, columnIndex) =>
Object.assign(rowItem, {
[ header[columnIndex] ]: Number(columnValue.trim())
}), {} // to be aggregated `rowItem` passed as initial value.
)
);
return { header, result };
}
console.log(
['1,2,3,4', '5, 6, 7, 8', '9,0,1,2']
.reduce(
rowwiseAssignColumValuesToHeaderColumnKeys, {
header: ['a', 'b', 'c', 'd'],
result: [],
},
).result
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
上述主要reduce基于的方法可以重構為一個可重用的映射函式,該函式將第二個thisArg引數考慮Array.prototype.map在內
function assignColumValuesAccordingToBoundHeaderColumnKeys(row) {
const header = this;
return row
.split(',')
.reduce((rowItem, columnValue, columnIndex) =>
Object.assign(rowItem, {
[ header[columnIndex] ]: Number(columnValue.trim())
}), {} // to be aggregated `rowItem` passed as initial value.
);
}
console.log(
['1,2,3,4', '5, 6, 7, 8', '9,0,1,2']
.map(
assignColumValuesAccordingToBoundHeaderColumnKeys,
['a', 'b', 'c', 'd'],
)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481242.html
標籤:javascript 数组 合并 映射 减少
下一篇:Unicode范圍作為向量陣列
