Невозможно повторить несколько значений JSON - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь использовать значение JSON для просмотра данных в ng-repeat. Но я получаю только первое значение. Я пытался использовать другой метод, но не получил значение правильно.

Мой ответ JSON: -

{
  "stylesheet": {
    "attribute-set": [
      {
        "attribute": {
          "_name": "text-align",
          "__prefix": "xsl",
          "__text": "center"
        },
        "_name": "__frontmatter",
        "__prefix": "xsl"
      },
      {
        "attribute": [
          {
            "_name": "space-before",
            "__prefix": "xsl",
            "__text": "80mm"
          },
          {
            "_name": "space-before.conditionality",
            "__prefix": "xsl",
            "__text": "retain"
          },
          {
            "_name": "font-size",
            "__prefix": "xsl",
            "__text": "22pt"
          },
          {
            "_name": "font-weight",
            "__prefix": "xsl",
            "__text": "bold"
          },
          {
            "_name": "line-height",
            "__prefix": "xsl",
            "__text": "140%"
          }
        ],
        "_name": "__frontmatter__title",
        "_use-attribute-sets": "common.title",
        "__prefix": "xsl"
      }
    ],
    "_xmlns:xsl": "http://www.w3.org/1999/XSL/Transform",
    "_xmlns:fo": "http://www.w3.org/1999/XSL/Format",
    "_version": "2.0",
    "__prefix": "xsl"
  }
}

По предложению из предыдущего вопроса я хочу получить все данные из "__name" с помощью клавиши "attribute".

Я попробовал это, как предложено на моем контроллере: -

console.log($scope.jsonObj);
                angular.forEach($scope.jsonObj,function(value,key){
                 console.log(value["attribute-set"][0]["attribute"]["_name"]);
                    });

jsonObj - это мой объект JSON

В моей консоли выводится text-align, что является первым значением атрибута _name.

Как мне получить ng-repeat значения _name из этого JSON?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Структура данных довольно ужасна, одни и те же ключи объектов с разными типами данных усложняют задачу. Однако это вернет вам список всех _name полей.

Затем вы привязываете это к своему объему и т. Д.

data
    .stylesheet['attribute-set']
    .map(x => {
        if (Array.isArray(x.attribute))
            return x.attribute.map(y => y['_name']);
        else
            return [x.attribute['_name']]; 
    })
    .reduce((accu, cur) => accu.concat(...cur), []);

По сути, оно извлекает поле _name в массив для каждого набора атрибутов, а затем уменьшает его в один массив.

Смотрите это в действии здесь

0 голосов
/ 06 сентября 2018

Я предполагаю, что вы хотите все значения для _name. Если вы этого не сделаете, пожалуйста, укажите, какие значения _name вы хотите. Во-первых, вам придется реструктурировать ваши данные, как это, со всеми атрибутами в одном массиве:

{
  "stylesheet": {
    "attribute_set": [
      {
        "_name": "text-align",
        "__prefix": "xsl",
        "__text": "center"
      },
      {
        "_name": "__frontmatter",
        "__prefix": "xsl"
      },
      {
        "_name": "space-before",
        "__prefix": "xsl",
        "__text": "80mm"
      },
      {
        "_name": "space-before.conditionality",
        "__prefix": "xsl",
        "__text": "retain"
      },
      {
        "_name": "font-size",
        "__prefix": "xsl",
        "__text": "22pt"
      },
      {
        "_name": "font-weight",
        "__prefix": "xsl",
        "__text": "bold"
      },
      {
        "_name": "line-height",
        "__prefix": "xsl",
        "__text": "140%"
      },
      {
        "_name": "__frontmatter__title",
        "_use-attribute-sets": "common.title",
        "__prefix": "xsl"
      }
    ],
    "_xmlns:xsl": "http://www.w3.org/1999/XSL/Transform",
    "_xmlns:fo": "http://www.w3.org/1999/XSL/Format",
    "_version": "2.0",
    "__prefix": "xsl"
  }
}

А потом работает:

angular.forEach($scope.jsonObj.stylesheet.attribute_set, function(value, key) {
    console.log(value._name);
});
...