将类似表格的二维数组转换为对象(JavaScript)
我有一个二维数组,看起来像这样:将类似表格的二维数组转换为对象(JavaScript),javascript,arrays,Javascript,Arrays,我有一个二维数组,看起来像这样: var myArray = [ ['Name', 'Age', 'Profession'], ['John', 34, 'Teacher'], ['Jane', 45, 'Artist'] ]; var myObject = { "Name": { "Name": "Name", "Age": "Age", "Profession": "Profession" }
var myArray = [
['Name', 'Age', 'Profession'],
['John', 34, 'Teacher'],
['Jane', 45, 'Artist']
];
var myObject =
{
"Name":
{
"Name": "Name",
"Age": "Age",
"Profession": "Profession"
}
"John":
{
"Name": "John",
"Age": 34,
"Profession": "Teacher"
}
"Jane":
{
"Name": "Jane",
"Age": 45,
"Profession": "Artist"
}
};
我想将此数组转换为如下所示的对象:
var myArray = [
['Name', 'Age', 'Profession'],
['John', 34, 'Teacher'],
['Jane', 45, 'Artist']
];
var myObject =
{
"Name":
{
"Name": "Name",
"Age": "Age",
"Profession": "Profession"
}
"John":
{
"Name": "John",
"Age": 34,
"Profession": "Teacher"
}
"Jane":
{
"Name": "Jane",
"Age": 45,
"Profession": "Artist"
}
};
在中,我遇到了Array.prototype.reduce(),我能够做到以下几点:
var myObject = myArray.reduce(function(result, currentItem) {
result[currentItem[0]] = currentItem;
return result;
}, {})
Logger.log(myObject);
// {John=[John, 34.0, Teacher], Jane=[Jane, 45.0, Artist], Name=[Name, Age, Profession]}
但是,我不知道如何应用reduce()来获取嵌套对象,或者是否需要其他方法
安德烈亚斯
编辑:
- 我在寻找一个动态的解决方案,也就是说:我事先不知道我的数组包含多少元素,或者它们的值是什么
- 我更喜欢一个比遍历所有元素(如果可能)更快、更优雅的解决方案
- 我认为最简单的方法是使用
另一种方法是只使用on-for语句
for(int i=1;myArray.length;i++)
{
var el = myArray[i];
myObjects2[el[0]] = {
'Name': el[0],
'Age': el[1],
'Profession': el[2]
}
}
具有reduce和对象以及一些嵌套属性的解决方案
var myArray=[['Name','Age','Profession',['John',34','Teacher',['Jane',45',Artist']],
result=myArray.reduce(函数(r,a){
//获取myArray的第一个元素('Name','John','Jane'),并将其作为键
//对于对象。如果没有可用对象,则生成新对象
//阅读这里:r.Name=r.Name | |{}
r[a[0]]=r[a[0]| |{};
//迭代[‘姓名’、‘年龄’、‘职业’]
myArray[0]。forEach(函数(b,i){
//根据对象的相应属性指定相应值
//阅读这里:r.Name.Name='Name'
//next r.Name.Age='Age'
r[a[0]][b]=a[i];
});
返回r;
}, {});
document.write(“”+JSON.stringify(结果,0,4)+“”)代码>
这个想法是在每一行做同样的减少
var myArray=[
[‘姓名’、‘年龄’、‘职业’],
[约翰,34岁,老师],
['Jane',45岁,'Artister']
];
var result=myArray.reduce(
函数(r,a){
var row=a.reduce(
功能(rr、cc、i){
rr[myArray[0][i]]=cc;
返回rr;
}, {});
r[a[0]]=行;
返回r;
}, {});
document.write(“”+JSON.stringify(结果,0,4)+“”)代码>确实如此。请注意,array.prototype.map
在IE8和早期版本()上不可用。您生成的是一个数组,而不是每个项都有属性的对象。是的,我知道,但这一部分很简单,我不想混淆这个示例。但是你可以只做myObject2[el[0]]={…}
我明白了,但是在我的例子中,我不知道我的数组由多少个元素组成,或者它们被调用了什么。对不起,我应该在我的问题中提到这一点。所以@Nina Scholz的答案对你来说会更好。这个作品很好,谢谢。但我还是想弄清楚它的作用。你能补充几句代码背后的想法吗?为什么第一个数组索引是对象的一部分?如果是动态的,基本上所有的解决方案都需要迭代。@epascarello:不确定,如果我没有弄错你的问题:名称(John,Jane)作为键和值的用法只是一个简单的例子。实际上,我将从几个值(例如姓名、出生日期和电子邮件)中创建一个唯一的键,并将其用作我的对象中的键。看起来像['name'、'Age'、'Profession']
正在指向一个表,只是看起来很奇怪,您可能会有一个条目。