使用字符串数组创建多级对象,将数组解析为JS对象

Use array of strings to create a multi level object, parsing arrays into JS objects

本文关键字:数组 对象 JS 创建 多级 字符串      更新时间:2023-09-26

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

"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]] = {};
}

显然这是没有接近正确的地方,我已经尝试了很多递归函数,但有点损失。这个例子最清楚地说明了我正在努力实现的目标。什么好主意吗?(请原谅代码错别字,这是转述)

您可以拆分名称并在此基础上构建对象。

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; }