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

时间:2018-04-03 11:43:06

标签: 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',
        '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 }
            ]

        }
}

一旦我创建了迭代函数,但是存在问题。是否可以使用迭代函数进行转换以及如何转换?

3 个答案:

答案 0 :(得分:2)

您可以创建具有值类型的对象,用于创建不同数据类型的新实例,然后使用x = df[[df['location']=='Aberdeen' & 'Glasgow' & 'London']]方法构建对象。

reduce()

答案 1 :(得分:2)

使用Object.keys()获取一系列密钥。 _Type const obj = {"meta.someArr.1.field":"321","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_Type":"number"}; const byType = { object: Object, array: Array }; const result = Object.keys(obj) .filter((k) => !k.includes('_Type')) // remove Type keys .sort((a, b) => a.length - b.length) // ensures that shorter (parent) keys are first .reduce((r, k) => { const type = obj[`${k}_Type`]; const valueByType = byType[type] && byType[type](); const value = valueByType ? valueByType : obj[k]; const keys = k.split('.'); let current = r; keys.forEach((key, i) => { if(!(key in current)) current[key] = value; else current = current[key]; }); return r; }, {}); console.log(result);FilterSort确保父母(较短)密钥是第一个的密钥,因为不确保对象中的密钥顺序。

Reduce键数组,每个键按类型获取值。如果类型不是object / array,则使用实际的键值。使用Array.forEach()迭代结果对象,直到找到叶子。添加带有值的键。



SoapClient




答案 2 :(得分:1)

  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;