Javascript 使用'转换对象;long.property.name';属性设置为树对象
我想从以下位置变换此类对象:Javascript 使用'转换对象;long.property.name';属性设置为树对象,javascript,object,underscore.js,lodash,Javascript,Object,Underscore.js,Lodash,我想从以下位置变换此类对象: foo = { 42: 'foo', 'a.b.c[0].42': 'bar', 'a.b.c[0].43': 'zet', 'a.d.c[0].42': 'baz' } 致: 有人知道如何实现convertToTree功能吗? 我们在我的项目中使用lodash,这样可以帮助进行基本操作 var对象={ 42:“福”, “a.b.c[0].42:“bar”, “a.b.c[0].43:“zet”, “a.d.c[0].42:“b
foo = {
42: 'foo',
'a.b.c[0].42': 'bar',
'a.b.c[0].43': 'zet',
'a.d.c[0].42': 'baz'
}
致:
有人知道如何实现convertToTree
功能吗?
我们在我的项目中使用lodash
,这样可以帮助进行基本操作
var对象={
42:“福”,
“a.b.c[0].42:“bar”,
“a.b.c[0].43:“zet”,
“a.d.c[0].42:“baz”
};
函数convertToTree(){
//代码在这里
}
convertToTree(对象)={
“42”:“foo”,
“a.b.c[0].42:“bar”,
“a.b.c[0].43:“zet”,
“a.d.c[0].42:“baz”,
“a”:{
“b”:{
“c”:[
{
“42”:“酒吧”,
“43”:“泽特”
}
]
},
“d”:{
“c”:[
{
“42”:“baz”
}
]
}
}
}
您需要为数字索引使用自定义函数,因为lodash将所有数字和数字视为字符串和数字。它会生成稀疏元素,这里不需要这些元素
函数设置值(对象、路径、值){
var last=path.pop();
reduce(函数(o,k,i,kk){
返回o[k]=o[k]| |(typeof(kk中的i+1?kk[i+1]:last)=='number'?[]:{});
},object)[last]=值;
}
var foo={42:'foo','a.b.c[0].42':'bar','a.b.c[0].43':'zet','a.d.c[0].42':'baz'},
bar={};
Object.keys(foo.forEach)(函数(k){
setValue(条,k.split(/\.\.;(?=\[)/).map(函数(v){返回v.match(/^\[.+\]$/)?+v.slice(1,-1):v;}),foo[k]);
});
console.log(条形);
.as控制台包装{max height:100%!important;top:0;}
有一个很小的库可以执行以下操作:
我的解决方案基于@mik01aj-answer
var rawObject={
42:“福”,
“a.b.c[0].42:“bar”,
“a.b.c[0].43:“zet”,
“a.d.c[0].42:“baz”
};
函数convertToTree(rowObjectData){
返回分配(
{},
rowObjectData,
_.reduce(rowObjectData,函数(结果、值、键){
返回设置(结果、键、值);
}, {}))
}
var convertedObject=convertToTree(rawObject);
console.log(u.result(convertedObject,“a.b.c[0].42”)=“bar”);
console.log(convertedObject[“a.b.c[0].42”]=“bar”);
能解决您的问题吗?您不想只在树中转换地图。相反,您希望在地图和该地图的树版本中有一个对象。@Bergi谢谢。这就是我要找的。@MarioSantini我同意标题不完全正确。非常感谢!撤消
函数正是我要找的。您的第一个解决方案可能是最优的,但很难支持。稀疏元素的问题对我来说不是必需的,我将更新我的问题。第二个解决方案看起来不错,但不幸的是,lodash#3.10.1没有zipObjectDeep方法。好吧,我还是建议更新你的lodash。这可以在这个过程中帮助你很多。太好了实用工具,谢谢!我今天将与我的团队讨论。
bar = {
42: 'foo',
'a.b.c[0].42': 'bar',
'a.b.c[0].43': 'zet',
'a.d.c[0].42': 'baz',
a: {
b: {
c: [{
42: 'bar', 43: 'zet'
}]
},
d: {
c: [{
42: 'baz'
}]
}
}
}
console.log(flattened);
// {
// 'a': true,
// 'b.bb[0]': 0,
// 'b.bb[1]': 1,
// 'b.bb[2]': 2,
// 'b.bb[3]': 3,
// 'b.bb[4]': 4
// }
unflattened = FlattenJS.undo(flattened);
console.log(unflattened);
// { a: true, b: { bb: [ 0, 1, 2, 3, 4 ] } }