如何将JSON对象结构转换为点表示法?

ffx*_*sam 6 javascript mongodb

我有一个我正在存储的变量,它将决定从查询中排除哪些字段:

excludeFields = {
  Contact: {
    Address: 0,
    Phone: 0
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要将其转换为可与Mongo一起使用的点符号findOne,例如:

things.findOne({}, {fields: {'Contact.Address': 0, 'Contact.Phone': 0}})
Run Code Online (Sandbox Code Playgroud)

只是传递excludeFields不起作用并导致错误,"投影值应为1,0,true或false之一"

things.findOne({}, {fields: excludeFields})
Run Code Online (Sandbox Code Playgroud)

我是否必须编写自己的函数来从层次结构转换为平点符号?或者是否有一些机制在JavaScript中执行此操作,我不知道?

Bla*_*ven 13

这应该足够灵活,以满足大多数需求:

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 Code Online (Sandbox Code Playgroud)

excludesFields像你这样运行你的变量:

dotNotate(excludeFields);
Run Code Online (Sandbox Code Playgroud)

它返回当前结构:

{ "Contact.Address" : 0, "Contact.Phone" : 0 }
Run Code Online (Sandbox Code Playgroud)

所以你甚至可以这样做,内联:

things.findOne({}, {fields: dotNotate(excludeFields) })
Run Code Online (Sandbox Code Playgroud)

或提供投影:

var projection = { "fields": {} };
dotNotate(excludeFields,projection.fields);
things.findOne({}, projection);
Run Code Online (Sandbox Code Playgroud)

除非你需要像这样的运算符,否则在所有深度都可以很好地工作,甚至可以使用数组$push.