#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. Виелен данк Нина, хороший ответ!