मेरे पास इस प्रकार की वस्तु है जो 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 }
            ]

        }
}

एक बार जब मैंने पुनरावृत्त फ़ंक्शन बनाया, लेकिन उसमें कोई समस्या थी। क्या Iterated फ़ंक्शन के साथ कनवर्ट करना संभव है और कैसे?

1
David 3 अप्रैल 2018, 14:43

2 जवाब

सबसे बढ़िया उत्तर

आप मूल्य प्रकारों के साथ ऑब्जेक्ट बना सकते हैं जिसका उपयोग आप विभिन्न डेटा प्रकारों के नए उदाहरण बनाने के लिए करेंगे और फिर अपनी ऑब्जेक्ट बनाने के लिए 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.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"}

const result = {}
const create = {'string': String,'number': Number,'boolean': Boolean,'array': Array,'object': Object}
const findType = (key, obj) => obj[key]

Object.keys(data).forEach(key => {
  if (!key.includes('Type')) {
    key.split('.').reduce((r, e, i, arr) => {
      let type = findType(key + '_Type', data);
      let value = create[data[key]] || arr[i + 1] ? new create[type] : new create[type](data[key]).valueOf()
      if (data[key] == 'false') value = false
      r[e] = r[e] || value;
      return r[e]
    }, result)
  }
})

console.log(result)
2
Nenad Vracar 3 अप्रैल 2018, 12:36
  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;
1
Jonas Wilms 3 अप्रैल 2018, 11:50