Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Разобрать jSON обьект (https://javascript.ru/forum/misc/61817-razobrat-json-obekt.html)

SergeySP 10.03.2016 13:02

Разобрать jSON обьект
 
есть массив вида:
[
  {
    "Name": "Ivanov",
    "Department": "72000"
  },
  {
    "Name": "Petrov",
    "Department": "72000"
  },
  {
    "Name": "kuznetsov",
    "Department": "72100"
  },
  {
    "Name": "Putin",
    "Department": "72110"
  },
  {
    "Name": "Pushkin",
    "Department": "31000"
  },
  {
    "Name": "Ivanov2",
    "Department": "31300"
  },
  {
    "Name": "Sidorov",
    "Department": "72110"
  },
    {
    "Name": "Sidorov",
    "Department": "01000"
  },
    {
    "Name": "Sidorov",
    "Department": "01000"
  },
    {
    "Name": "Sidorov",
    "Department": "01100"
  },
  {
    "Name": "Kozlov",
    "Department": "72110"
  }
]





Для каждой группы сотрудников нужно создать родительскую запись. вида{"Name": "01000","Department": "01000",id=1,parrentid = null}, самими сотрудникам записать в поле parrentid связь по id созданной записи.
Далее, между созданными родительскими записями нужно тоже расставить связи по логике. если в значении заполнены первые два символа а остальные три нули "72000", то у него "parrentid = null", далее значение которые начинаются на 72 но в конце 2 нуля а 3 символ не ноль,например:72100 то он должен стать дочерним с parrentid равным родительскому "72000",72110 должен стать дочерним для 72100 и т.д.

Пока смог реализовать только первую часть, т.е. у меня создаются уникальные записи и сотрудники к ним привязываются. Требуется помощь в реализации второй части.
Код:

function getdata(datajson){
		datajson.sort(function(a,b){return +a.Department.substring(0,5) > +b.Department.substring(0,5) ? 1 : -1});

		var i,
			j = 0,
			parentId = null,
			otdel = null,
			patt = /[^[0-9]/,
			myobj = [],
			departID;

		for (i = 0; i < datajson.length; i++) {
			
			departID = datajson[i].Department;
							if (otdel !== departID ){

								otdel = departID;
									myobj.push({
										Name:departID,
										Department:datajson[i].Department,
										id:++j,
										parentId:null
									});
								parentId = j;
								datajson[i].id = ++j;
								datajson[i].parentId = parentId;
								myobj.push(datajson[i]);
								

							}else{
								datajson[i].id =j;
								datajson[i].parentId = parentId;
								myobj.push(datajson[i])


							}

							j++;

				}    
		  console.log(JSON.stringify(myobj));
		  return myobj;
		}


На выходе должно получиться примерно вот так:

[
    {
    "Name": "72000",
    "Department": "72000",
    "id":1,
    "parentid":null
  },
  {
    "Name": "Ivanov",
    "Department": "72000",
    "id":2,
    "parentid":1
  },
  {
    "Name": "Petrov",
    "Department": "72000",
    "id":3,
    "parentid":1
  },
    {
    "Name": "72100",
    "Department": "72100",
    "id":4,
    "parentid":1
  },
  {
    "Name": "kuznetsov",
    "Department": "72100",
    "id":5,
    "parentid":4
  },
  {
    "Name": "72110",
    "Department": "72110",
    "id":6,
    "parentid":4
  },
  {
    "Name": "Putin",
    "Department": "72110",
    "id":7,
    "parentid":6
  }]

laimas 10.03.2016 13:12

Этот JSON с севера, а источник база?

SergeySP 10.03.2016 13:37

Да. Данные получаю с вебсервера, а там из базы берутся.

laimas 10.03.2016 16:29

Так почему веб-сервер не возвращает истинные идентификаторы записей и идентификаторы родителей, которые единственно истинные, а не цифры выдуманные на клиенте?

SergeySP 10.03.2016 16:36

На сервере они хранятся тоже в плоском виде, и записи не связаны.

laimas 10.03.2016 16:42

Цитата:

Сообщение от SergeySP
На сервере они хранятся тоже в плоском виде, и записи не связаны.

И это по вашему база? Какой прок хранить в базе список, записи которых явно имеют родителей, не указывая их? Это уму не постижимо.
Приведите записи в базе к структуре надлежащей и не заставляйте клиента заниматься ерундой.

SergeySP 10.03.2016 17:21

Все намного сложнее, это данные из OLAP, которые туда попадают еще из не скольких систем, в частности из ERP Галактика а там они находятся в том виде в котором нужны самой ERP, поэтому приходится работать с тем что имеем.

laimas 10.03.2016 17:38

Какая разница откуда они попадают, вы же их храните, вы с ними работаете, вам и заботиться об их структуре.

Ну стоит ли объяснять, что Иванов не может быть уникальным значением, и даже Иванов Иван Иванович тоже. И даже в пределах одного города, улицы не могут быть таковыми.

Подобные данные обязательно должны храниться в базе как иерархическая структура - родитель -> потомки. Вот то что вы описываете по "Department", делайте при добавлении записей в базу. А запрос в базу на их выборку должен сначала сортироваться по родительскому идентификатору, а затем по идентификатору записей, вы и получите, то что нужно в итоге.

Придумывать на клиенте идентификаторы, это уже иметь ошибку на 99%.

SergeySP 11.03.2016 15:04

Спасибо за ваше мнение но оно мне ни как не поможет. То что эти данные держать на сервере это понятно. Но сейчас их там нет, и не факт что будут.

laimas 11.03.2016 15:40

А что вам поможет?

Вы можете ответить на вопрос - зачем эти фиктивные ID на клиенте? Вы ведь их получаете исходя из значения Department, а значит это свойство уже должно быть уникальным. Если же держать данные в базе, то ID на клиенте, это профанация, думаю сами вполне можете догадаться почему.


Часовой пояс GMT +3, время: 20:42.