How To Convert Json Object Structure To Dot Notation?
I've got a variable I'm storing that will dictate what fields to exclude from a query: excludeFields = {   Contact: {     Address: 0,     Phone: 0   } }  I need to convert this to
Solution 1:
This should be flexible enough for most needs:
functiondotNotate(obj,target,prefix) {
  target = target || {},
  prefix = prefix || "";
  Object.keys(obj).forEach(function(key) {
    if ( typeof(obj[key]) === "object" && obj[key] !== null ) {
      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.
Solution 2:
I use a function pretty much similar to the accepted answer
functionconvertJsonToDot(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.
Solution 3:
var fields = {};
for (var k in excludeFields) {
  for (var p in excludeFields[k]) {
    fields[k + '.' + p] = excludeFields[k][p];
  }
}
Then:
things.findOne({}, {fields: fields})
Post a Comment for "How To Convert Json Object Structure To Dot Notation?"