3 回答

TA貢獻1827條經驗 獲得超8個贊
最簡單的方法可能是將.map值放入鍵值元組并調用Object.fromEntries它:
const theKeys = ['firstName', 'lastName', 'city'];
const theValues = [{
data: [
['John', 'Smith', 'New York'],
['Mike', 'Doe', 'Chicago']
]
}];
console.log(
theValues[0].data.map(e =>
Object.fromEntries(e.map((e,i) => [theKeys[i], e]))
)
)

TA貢獻1812條經驗 獲得超5個贊
如果您對屬性進行硬編碼而不是查看,您可以擺脫內部循環theKeys,但我懷疑您會想要這樣。您唯一真正不需要的是flatMap. 無論如何,大多數通用數組方法的速度并不為人所知(例如,forEach通常比普通for循環慢)。
FWIW,這似乎表現良好:
let result = [];
for (let i = 0; i < theValues[0].data.length; i++) {
let resultObj = {};
for (let j = 0; j < theKeys.length; j++) {
resultObj[theKeys[j]] = theValues[0].data[i][j];
}
result.push(resultObj);
}
我用 11k 個項目對其進行了測試,在 Chrome 中運行時間約為 5 毫秒。對于 90k 項,仍然只需要大約 30 毫秒。

TA貢獻1797條經驗 獲得超6個贊
您可以放棄這flatMap應該節省一些性能,只需使用普通循環完成所有操作:
const result = []
for (const v of theValues) {
for (const entry of v.data) {
const obj = {}
for (let i = 0; i < entry.length; i++) {
obj[theKeys[i]] = entry[i]
}
result.push(obj)
}
}
編輯:微觀優化
const result = []
const keysLength = theKeys.length
for (let i = theValues.length - 1; i >= 0; i--) {
const data = theValues[i].data
for (let j = data.length - 1; j >= 0; j--) {
const entry = data[j]
const obj = {}
for (let k = keysLength - 1; k >= 0; k--) {
obj[theKeys[k]] = entry[k]
}
result.push(obj)
}
}
添加回答
舉報