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 ] } }