带有列名数组和另一个包含值数组的 For 循环



有没有一种更具表演性的方法来制作这个循环?

rows有一个字符串数组数组

喜欢:

let rows = [
["col1val1", "09", "26", "1"],
["col1val2", "08", "59", "1"],
["col1val3", "09", "22", "1"]
];

并且columns具有相应的列名称

喜欢:

let columnsNames = ["col1", "col2", "col3", "col4"];

我的实际代码:

let _rows = [];
this.rows.forEach((row: string[]) => {
let _row = {};
columnsNames.forEach((col: string, i) => {
_row[col] = row[i];
});
_rows.push(_row);
});

目标是返回一个对象数组,其中列名称的相应值为rows

喜欢:

let rows = [
{
col1: "eventName"
col2: "09"
col3: "26"
col4: "1"
},
{
col1: "eventName"
col2: "08"
col3: "59"
col4: "1"
},...
];

在尝试查找性能最高的代码时,进行基准测试非常重要。使用 javascript 时,您应该始终考虑的一件事是,循环数组的任何方法 y 方法都不会像本机 for 循环那样执行。 您可以通过缓存length来挤出一些额外的内容,这样它就不会读取每次迭代。

因此,性能最高的解决方案几乎可以肯定是:

let columnsNames = ["col1", "col2", "col3", "col4"];
let rows = [
["col1val1", "09", "26", "1"],
["col1val2", "08", "59", "1"],
["col1val3", "09", "22", "1"]
];
var _rows = [];
var rlen = rows.length;
var clen = columnsNames.length;
for(var i=0;i<rlen;i++){
var _row = {};
for(var c=0;c<clen;c++){
_row[columnsNames[c]] = rows[i][c];
}
_rows.push(_row);
}
console.log(_rows);

我冒昧地将此解决方案与其他给定的解决方案进行了基准测试,正如预期的那样,结果略好一些。当然,结果会因运行时环境而异。

https://jsperf.com/array-of-columns-names-and-another-array-with-values/1

这是我的方法:

let rows = [
["col1val1", "09", "26", "1"],
["col1val2", "08", "59", "1"],
["col1val3", "09", "22", "1"]
];
let columnsNames = ["col1", "col2", "col3", "col4"];
const newRows = rows.map(row => {
const object = row.reduce((obj, entry, index) => {
return {
...obj,
[columnsNames[index]]: entry
};
}, {});
return {
...object
};
});
console.log(newRows);

1 行:

let rows = [
["col1val1", "09", "26", "1"],
["col1val2", "08", "59", "1"],
["col1val3", "09", "22", "1"]
];
let columnsNames = ["col1", "col2", "col3", "col4"];
let out = rows.map(row => Object.fromEntries(columnsNames.map((col, i) => [col, row[i]])));
console.log(out);

顺便说一句,感谢您提供非常清晰的最小示例、预期输出和尝试的解决方案!

(编辑(这是一个避免使用Object.fromEntries的修改:

let rows = [
["col1val1", "09", "26", "1"],
["col1val2", "08", "59", "1"],
["col1val3", "09", "22", "1"]
];
let columnsNames = ["col1", "col2", "col3", "col4"];
let objectFromEntries = properties =>
properties.reduce((obj, [key, val]) => {
obj[key] = val;
return obj;
}, {});
let out = rows.map(row => objectFromEntries(columnsNames.map((col, i) => [col, row[i]])));
console.log(out);

最新更新