Javascript 如何从特定的另一个对象创建对象

Javascript 如何从特定的另一个对象创建对象,javascript,arrays,object,Javascript,Arrays,Object,我有一个从Redis获取的对象类型 { 'username': 'hamet', 'username_Type': 'string', 'meta': 'object', 'meta_Type': 'object', 'meta.avatar': '/avatar.png', 'meta.avatar_Type': 'string', 'meta.active': 'false',

我有一个从Redis获取的对象类型

{
        'username': 'hamet',
        'username_Type': 'string',
        'meta': 'object',
        'meta_Type': 'object',
        'meta.avatar': '/avatar.png',
        'meta.avatar_Type': 'string',
        'meta.active': 'false',
        'meta.active_Type': 'boolean',
        'meta.someArr': 'array',
        'meta.someArr_Type': 'array',
        'meta.someArr.0': 'object',
        'meta.someArr.0_Type': 'object',
        'meta.someArr.0.field': '123',
        'meta.someArr.0.field_Type': 'number',
        'meta.someArr.1': 'object',
        'meta.someArr.1_Type': 'object',
        'meta.someArr.1.field': '321',
        'meta.someArr.1.field_Type': 'number'
}
我只想将此对象转换为以下有效对象:

{
        username: 'hamet',
        meta: {
            avatar: '/avatar.png',
            active: false,
            someArr: [
                { field: 123 },
                { field: 321 }
            ]

        }
}
有一次我创建了迭代函数,但有一个问题。是否可以使用迭代函数进行转换?如何转换

  const result = {};

  function apply(obj, value, key, ...keys) {
    if(keys.length) {
     apply(obj[key] || (obj[key] = {}), value ...keys);
    } else {
     obj[key] = value;
   }
 }

 for(const [key, value] of Object.entries(yourObj))
   apply(result, value, ...key.split("."));
可以使用递归方法生成嵌套结构。我没有包括一个检查键是否是一个数字,以便它创建一个数组,这是您的工作;)

如果您喜欢函数式编程:

  const apply = (obj, value, ...keys) => keys.slice(1).reduce((obj, key) => obj[key] || (obj[key] = {}), obj)[keys.pop()] = value;
可以使用递归方法生成嵌套结构。我没有包括一个检查键是否是一个数字,以便它创建一个数组,这是您的工作;)

如果您喜欢函数式编程:

  const apply = (obj, value, ...keys) => keys.slice(1).reduce((obj, key) => obj[key] || (obj[key] = {}), obj)[keys.pop()] = value;

您可以创建具有值类型的对象,这些值类型将用于创建不同数据类型的新实例,然后使用
reduce()
方法来构建您的对象

const data={“username”:“hamet”,“username_Type”:“string”,“meta”:“object”,“meta_Type”:“object”,“meta.avatar”:“/avatar.png”,“meta.avatar_Type”:“string”,“meta.active”:“false”,“meta.active_Type”:“boolean”,“meta.somarr”:“array”,“meta.somarr.0”:“object”,“meta”,“meta.somarr.0_Type”:“object”,“meta”,“meta.somer.somarr.0.field”:“123”,“meta.someArr.0.field_Type”:“number”,“meta.someArr.1”:“object”,“meta.someArr.1_Type”:“object”,“meta.someArr.1.field”:“321”,“meta.someArr.1.field_Type”:“number”}
常量结果={}
常量create={'string':string,'number':number,'boolean':boolean,'array':array,'object':object}
const findType=(key,obj)=>obj[key]
Object.keys(数据).forEach(key=>{
如果(!key.includes('Type')){
键。拆分('.')。减少((r,e,i,arr)=>{
let type=findType(键+'_type',数据);
设value=create[data[key]| | arr[i+1]?new create[type]:new create[type](data[key])。valueOf()
如果(数据[键]='false')值=false
r[e]=r[e]| |值;
返回r[e]
},结果)
}
})

console.log(result)
您可以创建具有值类型的对象,这些值类型将用于创建不同数据类型的新实例,然后使用
reduce()
方法来构建对象

const data={“username”:“hamet”,“username_Type”:“string”,“meta”:“object”,“meta_Type”:“object”,“meta.avatar”:“/avatar.png”,“meta.avatar_Type”:“string”,“meta.active”:“false”,“meta.active_Type”:“boolean”,“meta.somarr”:“array”,“meta.somarr.0”:“object”,“meta”,“meta.somer.somarr.0_Type”:“object”,“meta”,“meta.somer.somer.somarr.0.0.field”:“123”meta.someArr.0.field_Type:“number”,“meta.someArr.1:“object”,“meta.someArr.1_Type:“object”,“meta.someArr.1.field:“321”,“meta.someArr.1.field_Type:“number”}
常量结果={}
常量create={'string':string,'number':number,'boolean':boolean,'array':array,'object':object}
const findType=(key,obj)=>obj[key]
Object.keys(数据).forEach(key=>{
如果(!key.includes('Type')){
键。拆分('.')。减少((r,e,i,arr)=>{
let type=findType(键+'_type',数据);
设value=create[data[key]| | arr[i+1]?new create[type]:new create[type](data[key])。valueOf()
如果(数据[键]='false')值=false
r[e]=r[e]| |值;
返回r[e]
},结果)
}
})
console.log(result)
使用.out the
\u键入
键获取一个键数组。确保父(较短)键在第一位的键,因为无法确保键在对象中的顺序

键数组,对于每个键,按类型获取其值。如果类型不是object/array,则使用实际键值。使用迭代结果对象,直到到达叶。使用值添加键

const obj={“meta.someArr.1.field”:“321”,“username”:“hamet”,“username_Type”:“string”,“meta_Type”:“object”,“meta.avatar”:“/avatar.png”,“meta.avatar_Type”:“string”,“meta.active”:“false”,“meta.active_类型”:“boolean”,“meta.somarr”:“array”,“meta.somarr_Type”:“array”,“meta.somarr.0”:“object”,“meta.somarr.0”:“object”,“meta.somer.somarr.0_类型”:“object”,“object”meta.someArr.0.field:“123”,“meta.someArr.0.field_Type:“number”,“meta.someArr.1:“object”,“meta.someArr.1_Type:“object”,“meta.someArr.1.field_Type:“number”};
常量按类型={
对象:对象,,
数组:数组
};
常量结果=对象键(obj)
.filter((k)=>!k.includes(“\u Type”)//删除类型键
.sort((a,b)=>a.length-b.length)//确保较短的(父)键位于第一位
.减少((r,k)=>{
const type=obj[`${k}u type`];
constvaluebytype=byType[type]&&byType[type]();
常量值=valueByType?valueByType:obj[k];
常量键=k.split('.');
让电流=r;
keys.forEach((key,i)=>{
如果(!(输入当前值))当前值[输入]=值;
else current=当前[键];
});
返回r;
}, {});
console.log(result);
使用.out
\u键入
键获取一个键数组。确保父(短)键在第一位的键,因为无法确保键在对象中的顺序

键数组,对于每个键,按类型获取其值。如果类型不是object/array,则使用实际键值。使用迭代结果对象,直到到达叶。使用值添加键

const obj={“meta.someArr.1.field”:“321”,“username”:“hamet”,“username_Type”:“string”,“meta_Type”:“object”,“meta.avatar”:“/avatar.png”,“meta.avatar_Type”:“string”,“meta.active”:“false”,“meta.active_类型”:“boolean”,“meta.somarr”:“array”,“meta.somarr_Type”:“array”,“meta.somarr.0”:“object”,“meta.somarr.0”:“object”,“meta.somer.somarr.0_类型”:“object”,“object”meta.someArr.0.field:“123”,“meta.someArr.0.field_Type:“number”,“meta.someArr.1:“object”,“meta.someArr.1_Type:“object”,“meta.someArr.1.field_Type:“number”};
常量按类型={
对象:对象,,
数组:数组
};
常量结果=对象键(obj)
.filter((k)=>!k.includes(“\u Type”)//删除类型键
.sort((a,b)=>a.length-b.length)//确保较短的(父)键位于第一位
.减少((r,k)=>{
const type=obj[`${k}u type`];
常量值按类型=按类型