Форум программистов, компьютерный форум, киберфорум
Angular/AngularJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189

Выборка иерархических данных

15.07.2016, 13:29. Показов 1729. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!!!

Имеется файл json такого типа:

JSON
1
2
3
4
5
6
7
8
9
10
11
[
    {"Id":1,"Name":"Узел 1","Parent":""},
    {"Id":2,"Name":"Узел 2","Parent":""},
    {"Id":3,"Name":"Узел 3","Parent":""},
    {"Id":4,"Name":"Узел 1.1","Parent":"1"},
    {"Id":5,"Name":"Узел 1.2","Parent":"1"},
    {"Id":6,"Name":"Узел 2.1","Parent":"2"},
    {"Id":7,"Name":"Узел 3.1","Parent":"3"},
    {"Id":8,"Name":"Узел 3.1.1","Parent":"7"},
    {"Id":9,"Name":"Узел 3.2","Parent":"3"}
]
его необходимо привести к вот такому виду:
Название: 1324564646142315469865465465498794.png
Просмотров: 27

Размер: 4.9 Кб
а еще лучше сделать аккордион.

Каким образом это можно сделать???
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.07.2016, 13:29
Ответы с готовыми решениями:

Отображение иерархических данных
все работает , но как сделать чтоб подтаблица была не только у "item1" ,но и у остальных. int main(int argc, char *argv) { ...

Биндинг иерархических данных в ListBox
Добрый день, всем! Пытаюсь реализовать известный пример MSDN Это код XAML <Window x:Class="LeagueBinding.MainWindow" ...

Итератор связей иерархических данных
Здравствуйте, есть модель данных. public class Sections { public int Id { get; set; } public string...

30
Ренегат
Эксперт HTML/CSS
 Аватар для BANO
1740 / 1085 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
15.07.2016, 13:50
sergeybr, помогло бы если бы вы показали что нужно сделать именно из этих данных
0
 Аватар для ReasonX7
47 / 46 / 18
Регистрация: 11.12.2011
Сообщений: 147
16.07.2016, 00:46
Вот решение, конкретно под ваш случай: https://plnkr.co/edit/JuGRrC17buIJMIwUDSZT
При желании его можно попытаться обобщить для различных случаев.
1
16.07.2016, 01:10
 Комментарий модератора 
ReasonX7, нарушение пункта правил 4.11
выложите код на форум
0
 Аватар для ReasonX7
47 / 46 / 18
Регистрация: 11.12.2011
Сообщений: 147
16.07.2016, 01:13
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
 
  <head>
    <script data-require="angularjs@1.5.7" data-semver="1.5.7" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
    <script src="script.js"></script>
  </head>
 
  <body ng-app="listApp">
    <div ng-controller="MainController">
      <div nested-array="array"></div>
    </div>
  </body>
 
</html>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Code goes here
 
var app = angular.module('listApp', []);
 
app.controller('MainController', function($scope) {
  $scope.array = [
    {"Id":1,"Name":"Узел 1","Parent":""},
    {"Id":2,"Name":"Узел 2","Parent":""},
    {"Id":3,"Name":"Узел 3","Parent":""},
    {"Id":4,"Name":"Узел 1.1","Parent":"1"},
    {"Id":5,"Name":"Узел 1.2","Parent":"1"},
    {"Id":6,"Name":"Узел 2.1","Parent":"2"},
    {"Id":7,"Name":"Узел 3.1","Parent":"3"},
    {"Id":8,"Name":"Узел 3.1.1","Parent":"7"},
    {"Id":9,"Name":"Узел 3.2","Parent":"3"}
  ];
});
 
app.directive('nestedArray', function() {
  return {
    restrict: 'A',
    scope: {
      array: '=nestedArray'
    },
    link: link
  };
  
  function link($scope, $elem) {
    var arrayCopy = angular.copy($scope.array);
    var nestedArray = getNested(arrayCopy, 0);
    var html = getNestedHtml(nestedArray);
    // Причина использования jQuery - через директивы Angular HTML разметку не
    // вставить, на выходе увидим код, вместо списка.
    $elem.html(html);
  }
  
  // Данная ф-ция преобразовывает одномерный массив в многомерный.
  //  realArray - Массив, который мы будем преобразовывать. Важно: во время преоброзования данный масcив будет менятся!
  //  parentId - `Parent`, который мы будем искать.
  function getNested(realArray, parentId) {
    // Это переменная массива на данном уровне вложености.
    var childArray = [];
    var childLength = 0;
    var item = undefined;
    
    // Извлекаем подходящие элементы из `realArray` и передаем в `childArray`.
    do {
      childLength = childArray.length;
      item = retreiveItem(realArray, function(item) {
        return Number(item.Parent) === parentId;
      });
      item && childArray.push(item);
    } while (item);
    
    if (realArray.length) {
      // Исчем "детей" для каждого элемнта нового массива.
      for (var i = 0, x = childArray.length; i < x; i++) {
        childArray[i].children = getNested(realArray, childArray[i].Id);
      }
    }
    
    return childArray;
  }
  
  // Ф-ция формирует HTML рзаметку для массива с вложенностями.
  function getNestedHtml(array) {
    var html = '<ul>';
    for (var i = 0, x = array.length; i < x; i++) {
      html += '<li>' + array[i].Name + '</li>';
      html += array[i].children && array[i].children.length ? getNestedHtml(array[i].children) : '';
    }
    return html + '</ul>';
  }
  
  // Ф-ция извлекает один элемент из массива.
  function retreiveItem(array, retreiverFn) {
    // findIndex может не поддерживатся старыми браузерами.
    var index = array.findIndex(retreiverFn);
    if (~index) {
      return array.splice(index, 1)[0];
    }
  }
});
1
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 09:48  [ТС]
ReasonX7, большое тебе спасибо.

Добавлено через 2 часа 46 минут
А как можно сделать такое же из $http.get('');?
0
 Аватар для ReasonX7
47 / 46 / 18
Регистрация: 11.12.2011
Сообщений: 147
16.07.2016, 11:39
HTML5
1
2
3
4
5
  <body ng-app="listApp">
    <div ng-controller="MainController">
      <div ng-if="array" nested-array="array"></div>
    </div>
  </body>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
app.controller('MainController', function($scope, $http) {
  $http.get('').then(function () {
    $scope.array = [
      {"Id":1,"Name":"Узел 1","Parent":""},
      {"Id":2,"Name":"Узел 2","Parent":""},
      {"Id":3,"Name":"Узел 3","Parent":""},
      {"Id":4,"Name":"Узел 1.1","Parent":"1"},
      {"Id":5,"Name":"Узел 1.2","Parent":"1"},
      {"Id":6,"Name":"Узел 2.1","Parent":"2"},
      {"Id":7,"Name":"Узел 3.1","Parent":"3"},
      {"Id":8,"Name":"Узел 3.1.1","Parent":"7"},
      {"Id":9,"Name":"Узел 3.2","Parent":"3"}
    ];
  });
})
0
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 11:54  [ТС]
Я имел в виду с сервера получить ответ JSON и обработать его

Добавлено через 2 минуты
Мне выдает вот такую ошибку

TypeError: Cannot read property 'findIndex' of undefined
at retreiveItem (http://localhost:18466/Scripts... .js:193:26)
at getNested (http://localhost:18466/Scripts... .js:169:20)
at Object.link (http://localhost:18466/Scripts... .js:157:27)
at http://localhost:18466/Scripts/angular.js:1266:18
at http://localhost:18466/Scripts/angular.js:9751:44
at invokeLinkFn (http://localhost:18466/Scripts/angular.js:9757:9)
at nodeLinkFn (http://localhost:18466/Scripts/angular.js:9156:11)
at compositeLinkFn (http://localhost:18466/Scripts/angular.js:8459:13)
at nodeLinkFn (http://localhost:18466/Scripts/angular.js:9151:24)
at compositeLinkFn (http://localhost:18466/Scripts/angular.js:8459:13) <div nested-array="array" class="ng-isolate-scope">
0
 Аватар для ReasonX7
47 / 46 / 18
Регистрация: 11.12.2011
Сообщений: 147
16.07.2016, 11:59
Ах, да забыл подправить callback ф-цию:
JavaScript
1
2
3
4
5
app.controller('MainController', function($scope, $http) {
  $http.get('...').then(function (res) {
    $scope.array = res;
  });
})
Добавлено через 2 минуты
Цитата Сообщение от sergeybr Посмотреть сообщение
Мне выдает вот такую ошибку
Я же писал, что `findIndex` может не поддерживатся некоторыми браузерами. Можете написать свое решение или погуглить, это не сложно.

Добавлено через 1 минуту
Цитата Сообщение от sergeybr Посмотреть сообщение
<div nested-array="array" class="ng-isolate-scope">
Где `ng-if="array"`? Без него директива запустится не дожидаясь инициализации `array`.
0
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 12:00  [ТС]
У меня стоит Chrome. Когда я гружу массив из файла все проходит на УРА, но как только я пытаюсь это сделать по URL то у меня выдает такую ошибку
0
 Аватар для ReasonX7
47 / 46 / 18
Регистрация: 11.12.2011
Сообщений: 147
16.07.2016, 12:03
Мне не известен формат, в котором приходят данные. Это может быть: `res.data`, `res.items` и т.д.
Посмотрите в каком виде приходит `res` через `console.log` или в `network` вкладке браузера.
0
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 12:11  [ТС]
У меня с сервера уходит вот такой ответ:

JSON
1
[{"Uid":"85501464-bb19-11e4-b048-002590d0470f","Name":"Solo","Parent":"ef3dfea4-3ae1-11e2-a8f2-0025907802c9"},{"Uid":"2ac6ceec-b695-11e3-afc2-002590d0470f","Name":"Solaris","Parent":"d91d8ae9-21bd-11e3-aa59-e02a8292f64f"}]
это часть файла, он очень большой.

Здесь с UID я разобрался, а вот как дальше понять не могу

Добавлено через 1 минуту
Object {data: Array[390], status: 200, config: Object, statusText: "OK"}
0
 Аватар для ReasonX7
47 / 46 / 18
Регистрация: 11.12.2011
Сообщений: 147
16.07.2016, 12:26
Поменяйте `getNested(arrayCopy, 0)` на `getNested(arrayCopy, '')` и уберите преоброзование в число `Number(...)`.
0
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 12:31  [ТС]
Не помогло
0
 Аватар для ReasonX7
47 / 46 / 18
Регистрация: 11.12.2011
Сообщений: 147
16.07.2016, 12:32
Тогда файл в студию.
0
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 12:35  [ТС]
JSON?
0
 Аватар для ReasonX7
47 / 46 / 18
Регистрация: 11.12.2011
Сообщений: 147
16.07.2016, 12:37
Да.
0
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 12:40  [ТС]
Вот. Я сохранил ответ от сервера в файл
0
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 12:43  [ТС]
Вот
Вложения
Тип файла: rar test.json.rar (5.0 Кб, 2 просмотров)
0
 Аватар для sergeybr
13 / 13 / 0
Регистрация: 19.01.2010
Сообщений: 189
16.07.2016, 13:11  [ТС]
Из этого файла я смело могу загрузиться, а вот когда приходит ответ на запрос $http.get у меня возникают проблемы и не могу понять почему.

Добавлено через 11 минут
Cannot read property 'findIndex' of undefined - пишет когда к нему приходит $scope.array undefined, а он не грузится массивом в $scope.array = res; при отработке запроса get.

Добавлено через 14 минут
Может я их просто как то неправильно помещаю в $scope?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.07.2016, 13:11
Помогаю со студенческими работами здесь

Добавление иерархических данных в Treeview
Здравствуйте. Есть данные, надо добавить в treeview. Проблема в том что после двух childNodes не могу добавить, ошибка . Пример добавление...

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

Несколько иерархических имён пользователя
На всякий случай переспрошу тут. Может ли у пользователя быть одновременно несколько иерархических имён? Например CN=Julia...

Динамика распределения власти в иерархических структурах
Доброго дня. Ребят, помогите составить диф уравнение и решить его, V() и F() упразднить. Не могу понять, получается функция от двух...

Выборка данных из таблицы и суммирование этих данных
Здравствуйте, у меня затуп. Мне необходимо просуммировать значения из таблицы, однако они идут не по порядку, поэтому я создал запрос с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru