【问题标题】:Use array of strings to create a multi level object, parsing arrays into JS objects使用字符串数组创建多级对象,将数组解析成JS对象
【发布时间】:2017-03-02 19:03:43
【问题描述】:

我有这个数组需要被解析成一个有用的对象。每个值的名称都是由 / 字符分隔的命名空间的集合。每个 '/' 之间的值需要转成 JS Objects 属性:

"status": [
  {
    "message": "OK",
    "name": "/Computer",
    "values": []
  },
  {
    "name": "/Computer/CPU Usage",
    "values": []
  },
  {
    "name": "/Computer/CPU Temp",
    "values": []
  },
  {
    "name": "/Computer/hardware/memory",
    "values": []
  }
]

我需要它变成这样:

"status": {
  "computer": {
      "CPU Usage": {
        "values": []
      },
      "CPU Temp": {
        "values": []
      },
      "hardware": {
        "memory": {
          "values": []
        }
      }
    }
  }

到目前为止,我已经这样做了:

var statii = status, // from above..
    _parsedStatii = {};

for (var i = 0; statii.length < 0; i ++) {
    var _nameSpaces = statii[i].name.split('/');

    // Start at 1 because index 0 is empty (before the first slash)
    if (!_parsedStatii[_nameSpaces[1]]) {
        _parsedStatii[_nameSpaces[1]] = {};
    }

    if (!_parsedStatii[_nameSpaces[1]][_nameSpaces[2]])
        _parsedStatii[_nameSpaces[1]][_nameSpaces[2]] = {};


    if (!_parsedStatii[_nameSpaces[1]][_nameSpaces[2]][_nameSpaces[3]])
        _parsedStatii[_nameSpaces[1]][_nameSpaces[2]][_nameSpaces[3]] = {};


    if (!_parsedStatii[_nameSpaces[1]][_nameSpaces[2]][_nameSpaces[3]][_nameSpaces[4]])
        _parsedStatii[_nameSpaces[1]][_nameSpaces[2]][_nameSpaces[3]][_nameSpaces[4]] = {};

}

显然它不是最合适的,我尝试了很多递归函数,但有点不知所措。这个例子最清楚地表达了我想要实现的目标。有任何想法吗? (请原谅代码拼写错误,它是改写的)

【问题讨论】:

    标签: javascript jquery arrays sorting javascript-objects


    【解决方案1】:

    您可以拆分名称并在其上构建对象。

    var data = { "status": [{ "message": "OK", "name": "/Computer", "values": [] }, { "name": "/Computer/CPU Usage", "values": [] }, { "name": "/Computer/CPU Temp", "values": [] }, { "name": "/Computer/hardware/memory", "values": [] }] },
        object = {};
    
    data.status.forEach(function (a) {
        a.name.slice(1).split('/').reduce(function (o, k) {
            return o[k] = o[k] || {};
        }, object).values = a.values;
    });
    
    console.log(object);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • Vielen dank Nina,很好的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多