我对JavaScript完全陌生,并且正在学校学习初学者水平的课程。
我有一个作业,其中要求我们创建一个函数,该函数将列标题用作键,将数据用作每一行的值,从而将2D数组转换为字典。
我想我知道如何将第一行(用作标题)和其余的行(用作行)分开,但是在将其转换为字典时遇到麻烦。
这是我到目前为止所写的内容:
function rowsToObjects(data) {
var headers = data[1];
data.shift();
//var rows = alert(data);
var rows = alert(data.slice(1));
}
这是输出的示例:
const headers = ['a', 'b', 'c'];//Should not be hardcoded - subject to change depending on the grader
const rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];//Should not be hardcoded - subject to change depending on the grader
const result = rowsToObjects({headers, rows})
console.log(result);
// [{a: 1, b: 2, c: 3}, {a: 4, b: 5, c: 6}, {a: 7, b: 8, c: 9}];
如果可以使用for循环,我会知道如何为每行创建一个字典,但是我们不允许使用while循环,for循环,for ... in循环,for ... of循环, forEach方法,所以我在想办法做到这一点,并使我的输出看起来像示例中显示的那样。
欢迎任何帮助,非常感谢!
答案 0 :(得分:1)
您可以在Array.prototype.reduce
数组上使用rows
来迭代rows
二维数组中的每个数组。
然后,通过使用Array.prototype.reduce
使用索引来映射headers
中与rows
数组的每个数组值相对应的i
中的值,为2-D数组中的每个数组创建一个临时对象const headers = ['a', 'b', 'c'];
const rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
const result = rowsToObjects(headers, rows)
console.log(result);
// [{a: 1, b: 2, c: 3}, {a: 4, b: 5, c: 6}, {a: 7, b: 8, c: 9}];
function rowsToObjects(headers, rows){
return rows.reduce((acc, e, idx) => {
acc.push(headers.reduce((r, h, i)=> {r[h] = e[i]; return r; }, {}))
return acc;
}, []);
}
:
int main(int argc, char **argv){
struct argnum{
int rank;
char fileNamne[10];
};
void** argtab= malloc(sizeof(struct argnum)*(argc-1));
for(int i=0; i<argc-1; i++){
argtab[i]->rank=i;
argtab[i]->filename=argv[i];
}
}
答案 1 :(得分:0)
您可以使用Array.reduce
遍历所有数组并将它们简化为对象。
function arrayToObjects(rows){
const headers = rows.shift();//shift headers out of rows
return rows.map(rowsToObjects);
function rowsToObjects(row) {
return row.reduce((obj,e,i)=>{
obj[headers[i]]=e;
return obj;
},{})
}
}
console.log(arrayToObjects([['a', 'b', 'c'],[1, 2, 3], [4, 5, 6], [7, 8, 9]]));
答案 2 :(得分:0)
使用map
遍历行,然后使用reduce
将行(c
)中的每个单元格(r
)与使用索引({{ 1}})。
这里是一种单线的说法:
i