我想把这样的物体展平。。
var obj2 = {
"firstName": "John",
"lastName": "Green",
"car.make": "Honda",
"car.model": "Civic",
"car.revisions.0.miles": 10150,
"car.revisions.0.code": "REV01",
"car.revisions.0.changes": "",
"car.revisions.1.miles": 20021,
"car.revisions.1.code": "REV02",
"car.revisions.1.changes.0.type": "asthetic",
"car.revisions.1.changes.0.desc": "Left tire cap",
"car.revisions.1.changes.1.type": "mechanic",
"car.revisions.1.changes.1.desc": "Engine pressure regulator",
"visits.0.date": "2015-01-01",
"visits.0.dealer": "DEAL-001",
"visits.1.date": "2015-03-01",
"visits.1.dealer": "DEAL-002"
};
...转换为一个包含嵌套对象和数组的对象,如下所示:
{
firstName: 'John',
lastName: 'Green',
car: {
make: 'Honda',
model: 'Civic',
revisions: [
{ miles: 10150, code: 'REV01', changes: ''},
{ miles: 20021, code: 'REV02', changes: [
{ type: 'asthetic', desc: 'Left tire cap' },
{ type: 'mechanic', desc: 'Engine pressure regulator' }
] }
]
},
visits: [
{ date: '2015-01-01', dealer: 'DEAL-001' },
{ date: '2015-03-01', dealer: 'DEAL-002' }
]
}
以下是我失败的尝试:
function unflatten(obj) {
var result = {};
for (var property in obj) {
if (property.indexOf('.') > -1) {
var substrings = property.split('.');
console.log(substrings[0], substrings[1]);
} else {
result[property] = obj[property];
}
}
return result;
};
我很快就开始不必要地重复代码,以便进行对象和数组的嵌套。这绝对是需要递归的东西。有什么想法吗?
编辑:我也问了相反的问题,flatten,在another question中。
6条答案
按热度按时间zpqajqem1#
你可以先使用
for...in
循环来循环对象属性,然后在.
处拆分每个键,然后使用reduce来构建嵌套属性。t5fffqht2#
尝试将问题分解为两个不同的挑战:
1.按路径设置值
1.在对象上循环并逐个展开关键点
你可以从一个
setIn
函数开始,它看起来像这样:然后将其与
unflatten
函数结合,该函数循环遍历为每个键运行setIn
的对象。当然,已经有一个npm package来实现这个功能,而且你也可以很容易地使用lodash的
_.set
等函数来实现自己的功能。你不太可能会遇到一个足够长的路径,以至于你最终会耗尽堆栈帧,但是当然也可以使用循环或trampolines来实现
setIn
而不使用递归。最后,如果你喜欢不可变的数据,并且你想使用一个不修改你的数据结构的
setIn
版本,那么你可以看看Zaphod中的实现--一个JavaScript库,用于将原生数据结构视为不可变的。oymdgrw73#
您可以使用lodash库与键和设置函数来构建更清晰的代码。
这个想法是,您可以使用.set转换对象中的每个条目,并将其合并到全局对象中。
py49o6xq4#
你可以遍历拆分后的
substrings
和一个临时对象,检查键是否存在,然后构建一个新的属性,检查下一个属性是否是有限数,然后分配一个数组,否则分配一个对象。最后用最后一个子字符串将值分配给临时对象。稍微更紧凑的版本可能是这样的
一个二个一个一个
cgvd09ve5#
quhf5bfb6#