【问题标题】:How can I manipulate an object's structure into a 'dot notation'-style array如何将对象的结构操作为“点表示法”样式的数组
【发布时间】:2017-08-16 22:09:45
【问题描述】:

我正在使用 Meteor 开发一个项目,该项目使用 Mongoose(使用 Meteor.HTTP)连接到外部 API。我有嵌套对象,其源数据如下所示:

{name: "asdasd", active: true, status: Object, domain: "asdas", category: "1"…}

我需要以这种格式 POST/PUT 数据:

{
  active: true,
  category: "1",
  contact.companyName: "asd",
  contact.email: "asd",
  contact.managerName: "asd",
  contact.phone: "asd",
  domain: "asdasd",
  name: "asjdnas",
  ImagePaths: ["asdasdad","asdasdAsd"],
}

没有嵌套样式对象,或任何类型的:

ImagePaths[0] : asdasdad,
ImagePaths[1] : asdasdad

sites: 
   0: "565f1c7da35dcaa718713f4f"

等等。我找到了这段代码(@rhalff)

var dotize = dotize || {};

dotize.parse = function(jsonobj, prefix) {
  var newobj = {};
  function recurse(o, p) {
    for (var f in o)
    {
      var pre = (p === undefined ? '' : p + ".");
      if (o[f] && typeof o[f] === "object"){
        newobj = recurse(o[f], pre + f);
      } else {
        newobj[pre + f] = o[f];
      }
    }
    return newobj;
  }
  return recurse(jsonobj, prefix);
};

但我仍然遇到数组问题。它们看起来像这样:

  Paths.0: "asdkmalksmdasd",
  Paths.1: "asdasdad",

我需要的是这个:

Paths:["asdkmalksmdasd","asdasdad"];

你可以在jsbin上玩:https://jsbin.com/kadivewoti/edit?js,console

我怎样才能做到这一点?

【问题讨论】:

  • ImagePaths 属性导致了您的问题?

标签: javascript node.js meteor


【解决方案1】:

我在代码中添加了一个if-statement

var dotize = dotize || {};

dotize.parse = function(jsonobj, prefix) {
  var newobj = {};
  function recurse(o, p) {
    for (var f in o)
    {
      var pre = (p === undefined ? '' : p + ".");
      if(o[f] && o[f].length){
        newobj[f] = o[f];
      }
      else if (o[f] && typeof o[f] === "object"){
        newobj = recurse(o[f], pre + f);
      } 
      else {
        newobj[pre + f] = o[f];
      }
    }
    return newobj;
  }
  return recurse(jsonobj, prefix);
};

var mydata = '{"name":"asjdnas","active":true,"status":{"pending":true,"comment":"asdasd"},"domain":"asdasd","category":"1","contact":{"companyName":"asd","managerName":"asd","phone":"asd","email":"asd"},"server":{"os":"akjsdn"},"Paths":["asdkmalksmdasd","asdasdad"]}';


mydata = JSON.parse(mydata);
mydata = dotize.parse(mydata);
console.log(mydata);

if(o[f] && o[f].length){
    newobj[f] = o[f];
}

【讨论】:

  • if( Object.prototype.toString.call( o[f] ) === '[object Array]' )
猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 2018-08-16
  • 2019-06-11
  • 2014-03-25
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多