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)
}
}
添加回答
举报