Вложенный объект json в отдельные объекты json с повторяющимися родительскими данными для построения html-таблицы - PullRequest
0 голосов
/ 21 июня 2019

Это вложенный файл json, и я пытаюсь расположить его в удобочитаемом формате для отображения в таблице.

Я пытался вручную поместить все ключи и значения в цикл for, но это должно бытьэлегантный способ добиться этого, и, следовательно, я достигаю SO.

Фактический JSON является довольно вложенным и требует времени для выполнения данных с 500k строк

Результат должен быть улучшен JSON с родителемзначения, появляющиеся и для дочерних значений

var property = {
	"data": [{
		"ID": "123456",
		"name": "Coleridge st",
		"criteria": [
			{
				"type": "type1",
				"name": "name1",
				"value": "7",
				"properties": []
			},
			{
				"type": "type2",
				"name": "name2",
				"value": "6",
				"properties": [
					{
						"type": "MAX",
						"name": "one",
						"value": "100"
					}, {
						"type": "MIN",
						"name": "five",
						"value": "5"
					}

				]
			},
			{
				"type": "type3",
				"name": "name3",
				"value": "5",
				"properties": [{
					"type": "MAX1",
					"name": "one6",
					"value": "1006"
				}, {
					"type": "MIN2",
					"name": "five6",
					"value": "56"
				}]
			}
		]
	},
	{
		"ID": "456789",
		"name": "New Jersy",
		"criteria": [
			{
				"type": "type4",
				"name": "name4",
				"value": "6",
				"properties": [{
					"type": "MAX12",
					"name": "one12",
					"value": "10012"
				}, {
					"type": "MIN23",
					"name": "five12",
					"value": "532"
				}]
			}
		]
	}]
};

var output = [];
property.data.forEach(function (users) {

	var multirows = {
		id: users.ID,
		name: users.name,
	};

	for (var i = 0; i < users.criteria.length; i++) {
		var criterias = {
			type: users.criteria[i].type,
			name: users.criteria[i].name,
			value: users.criteria[i].value,
		}

		var mat_contacts_rows;
		if (!isEmpty(users.criteria[i].properties)) {
			for (var j = 0; j < users.criteria[i].properties.length; j++) {
				var property = {
					type: users.criteria[i].properties[j].type,
					name: users.criteria[i].properties[j].name,
					value: users.criteria[i].properties[j].value
				};

				mat_contacts_rows = { ...multirows, ...{ criteria: criterias }, ...{ properties: property } };
				output.push(mat_contacts_rows);
			}
		} else {
			var property = [];
			mat_contacts_rows = { ...multirows, ...{ criteria: criterias }, ...{ properties: property } };
			output.push(mat_contacts_rows);
		}
	}
});

console.log(JSON.stringify(output, undefined, 2))


function isEmpty(obj) {
	for (var key in obj) {
		if (obj.hasOwnProperty(key))
			return false;
	}
	return true;
}

1 Ответ

1 голос
/ 21 июня 2019

Я думаю, что это может быть отличным упражнением для вас, чтобы не отвечать на ваш вопрос, а дать вам несколько советов. Сначала вы должны взглянуть на: Lodash wish имеет множество полезных методов, которые помогут вам делать то, что вы пытаетесь сделать. Во второй раз вам следует избегать использования циклов .forEach или for и попробовать использовать Array.prototype.map или Array.prototype.reduce

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...