Используйте массив строк для создания многоуровневого объекта, преобразуя массивы в объекты JS

#javascript #jquery #arrays #sorting #javascript-objects

#javascript #jquery #массивы #сортировка #javascript-объекты

Вопрос:

У меня есть этот массив, который нужно разобрать на полезный объект. Имена каждого значения представляют собой набор пространств имен, разделенных символами / . Значения между каждым ‘/’ необходимо преобразовать в свойство 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]] = {};

}
  

Очевидно, что это не совсем так, я перепробовал множество рекурсивных функций, но нахожусь в некоторой растерянности. Этот пример дает наиболее четкое представление о том, чего я пытаюсь достичь. Есть идеи? (Пожалуйста, извините за опечатки в коде, это было перефразировано)

Ответ №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; }  

Комментарии:

1. Виелен данк Нина, хороший ответ!