How to convert JSON object structure to dot notation?

后端 未结 3 1428
旧时难觅i
旧时难觅i 2020-12-16 01:42

I\'ve got a variable I\'m storing that will dictate what fields to exclude from a query:

excludeFields = {
  Contact: {
    Address: 0,
    Phone: 0
  }
}


        
相关标签:
3条回答
  • 2020-12-16 02:07

    This should be flexible enough for most needs:

    function dotNotate(obj,target,prefix) {
      target = target || {},
      prefix = prefix || "";
    
      Object.keys(obj).forEach(function(key) {
        if ( typeof(obj[key]) === "object" ) {
          dotNotate(obj[key],target,prefix + key + ".");
        } else {
          return target[prefix + key] = obj[key];
        }
      });
    
      return target;
    }
    

    Run on your excludesFields variable like so:

    dotNotate(excludeFields);
    

    It returns the current structure:

    { "Contact.Address" : 0, "Contact.Phone" : 0 }
    

    So you can even do, inline:

    things.findOne({}, {fields: dotNotate(excludeFields) })
    

    Or provide as a projection:

    var projection = { "fields": {} };
    dotNotate(excludeFields,projection.fields);
    things.findOne({}, projection);
    

    Works nicely at all depths and even with arrays in an essential way, unless you need operators like $push.

    0 讨论(0)
  • 2020-12-16 02:11
    var fields = {};
    for (var k in excludeFields) {
      for (var p in excludeFields[k]) {
        fields[k + '.' + p] = excludeFields[k][p];
      }
    }
    

    Then:

    things.findOne({}, {fields: fields})
    
    0 讨论(0)
  • 2020-12-16 02:26

    I use a function pretty much similar to the accepted answer

        function convertJsonToDot(obj, parent = [], keyValue = {}) {
          for (let key in obj) {
            let keyPath = [...parent, key];
            if (obj[key]!== null && typeof obj[key] === 'object') {
                Object.assign(keyValue, convertJsonToDot(obj[key], keyPath, keyValue));
            } else {
                keyValue[keyPath.join('.')] = obj[key];
            }
        }
        return keyValue;
    }
    

    Here, I do an additional check 'obj[key] !== null' because unfortunately null is also of type 'object'.

    I actually wanted to add this a comment to the accepted answer but couldn't because of not enough reputation.

    0 讨论(0)
提交回复
热议问题