Получение массива внутри массива - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть объект JSON, который я получаю по умолчанию: -

$scope.ContentObj= {
      "attribute-set": [
        {
          "attribute": [
            {
              "_name": "text-align",
              "__prefix": "xsl",
              "__text": "end"
            },
            {
              "_name": "end-indent",
              "__prefix": "xsl",
              "__text": "10pt"
            }
          ],
          "_name": "odd__header",
          "__prefix": "xsl"
        },
        {
          "attribute": {
            "_name": "font-weight",
            "__prefix": "xsl",
            "__text": "bold"
          },
          "_name": "pagenum",
          "__prefix": "xsl"
        }
      ],
      "_version": "2.0",
      "__prefix": "xsl"
    }

ПРИМЕЧАНИЕ: - Я выполняю операцию на attribute второго attribute-set имени: pagenum

Теперь я делаю массив attribute-set[1]-> attribute, поскольку он является объектом.Я делаю attribute массив, потому что мне нужно добавить в него больше объектов.

if(typeof $scope.ContentObj.stylesheet["attribute-set"][1].attribute === "object"){ //Check if object
                const content = $scope.ContentObj.stylesheet["attribute-set"][1].attribute; //Get the content
                $scope.ContentObj.stylesheet["attribute-set"][1].attribute = [content]; //Put the content in an array
            }

Теперь он успешно создает массив: -

$scope.ContentObj= {
      "attribute-set": [
        {
          "attribute": [
            {
              "_name": "text-align",
              "__prefix": "xsl",
              "__text": "end"
            },
            {
              "_name": "end-indent",
              "__prefix": "xsl",
              "__text": "10pt"
            }
          ],
          "_name": "odd__header",
          "__prefix": "xsl"
        },
        {
          "attribute":[
          {
            "_name": "font-weight",
            "__prefix": "xsl",
            "__text": "bold"
          }
          ],
          "_name": "pagenum",
          "__prefix": "xsl"
        }
      ],
      "_version": "2.0",
      "__prefix": "xsl"
    }

После этого я пытаюсьтолкать объекты, проверяя _name, который уже присутствует там или нет.Я могу успешно вставить этот код в массив с помощью следующего кода: -

//check color  
    var checkContentPageColor = obj => obj._name === 'color';
//for checking font name
    var checkContentPageFont = obj => obj._name === 'font-family';

//check color in the attr json
var checkContentPageColor_available = $scope.ContentObj.stylesheet["attribute-set"][1].attribute.some(checkContentPageColor);
// check font family
var checkContentPageFont_available = $scope.ContentObj.stylesheet["attribute-set"][1].attribute.some(checkContentPageFont);

                if( checkContentPageColor_available === false && checkContentPageFont_available  === false ){
                    console.log('not available' );
                    $scope.ContentObj.stylesheet["attribute-set"][1].attribute.push({
                                "_name": "color",
                                "__prefix": "xsl",
                                "__text": "black"
                              },{
                                "_name": "font-family",
                                "__prefix": "xsl",
                                "__text": "sans"
                              }
                              );
                    console.log("pushed successfully");     
                    console.log($scope.ContentObj);             
                }

Итак, теперь я получаю результат, подобный этому { attribute: [{..},{..},{..}],something }, который является правильным.: -

$scope.ContentObj= {
      "attribute-set": [
        {
          "attribute": [
            {
              "_name": "text-align",
              "__prefix": "xsl",
              "__text": "end"
            },
            {
              "_name": "end-indent",
              "__prefix": "xsl",
              "__text": "10pt"
            }
          ],
          "_name": "odd__header",
          "__prefix": "xsl"
        },
        {
          "attribute":[
          {
        "_name": "font-weight",
        "__prefix": "xsl",
        "__text": "100"
      },
      {
        "_name": "color",
        "__prefix": "xsl",
        "__text": "black"
      },
      {
        "_name": "font-family",
        "__prefix": "xsl",
        "__text": "sans"
      }
          ],
          "_name": "pagenum",
          "__prefix": "xsl"
        }
      ],
      "_version": "2.0",
      "__prefix": "xsl"
    }

После этого, когда я перезагружаю приложение, код снова получает толчок, создавая двойной массив.JSON теперь выглядит следующим образом { attribute: [[{..},{..},{..}],{..},{..}],something } : -

    {
          "attribute-set": [
            {
              "attribute": [
                {
                  "_name": "text-align",
                  "__prefix": "xsl",
                  "__text": "end"
                },
                {
                  "_name": "end-indent",
                  "__prefix": "xsl",
                  "__text": "10pt"
                }
              ],
              "_name": "odd__header",
              "__prefix": "xsl"
            },
            {
              "attribute":[[
              {
            "_name": "font-weight",
            "__prefix": "xsl",
            "__text": "100"
          },
          {
            "_name": "color",
            "__prefix": "xsl",
            "__text": "black"
          },
          {
            "_name": "font-family",
            "__prefix": "xsl",
            "__text": "sans"
          }],
          {
            "_name": "color",
            "__prefix": "xsl",
            "__text": "black"
          },
          {
            "_name": "font-family",
            "__prefix": "xsl",
            "__text": "sans"
          }
              ],
              "_name": "pagenum",
              "__prefix": "xsl"
            }
          ],
          "_version": "2.0",
          "__prefix": "xsl"
}

Где я ошибаюсь?Предложите некоторые изменения в соответствии с моим кодом, которые я должен сделать.Я застрял здесь с давних времен.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Проблема в том, как вы пытаетесь различить «Объект» и «Массив» - Массивы - это объекты

if(typeof $scope.ContentObj.stylesheet["attribute-set"][1].attribute === "object"){ ... } //Check if object

Это всегда так - учтите это:

const o = {"A": 1, "B": 2}
const l = [o]
const n = [1, 2]

typeof(o) //"object"
typeof(l) //"object"
typeof(n) //"object"

Вместо этого вы, вероятно, захотите использовать instanceof

o instanceof Array //false
l instanceof Array //true
n instance of Array //true
0 голосов
/ 17 декабря 2018

Вы должны проверить, существует ли значение ключа "_name" уже.Вот небольшая утилита, которая проверяет, существует ли конкретный атрибут _name и автоматически отправляет его в массив, если атрибут _name не найден.

Песочница: https://codesandbox.io/s/o1vpkxv5w5

function addAtts(arr, att) {
    var found = arr.some(function (at) {
      return at._name === att._name;
    });
    if (!found) {
        arr.push(att);
    }
}

addAtts(object["attribute-set"][1].attribute, {
    "_name": "color",
    "__prefix": "xsl",
    "__text": "black"
});

addAtts(object["attribute-set"][1].attribute, {
    "_name": "font-family",
    "__prefix": "xsl",
    "__text": "sans"
});

console.log(object["attribute-set"][1]);

Результат:

{ attribute:
   [ { _name: 'font-weight', __prefix: 'xsl', __text: 'bold' },
     { _name: 'color', __prefix: 'xsl', __text: 'black' },
     { _name: 'font-family', __prefix: 'xsl', __text: 'sans' } ],
  _name: 'pagenum',
  __prefix: 'xsl' }

Попробуем запустить его снова, выдав те же атрибуты, но добавим новый.

addAtts(object["attribute-set"][1].attribute, {
    "_name": "color",
    "__prefix": "xsl",
    "__text": "black"
});

addAtts(object["attribute-set"][1].attribute, {
    "_name": "font-family",
    "__prefix": "xsl",
    "__text": "sans"
});

addAtts(object["attribute-set"][1].attribute, {
    "_name": "font-family",
    "__prefix": "xsl",
    "__text": "sans"
});

console.log(object["attribute-set"][1]);

Результат:

{ attribute:
   [ { _name: 'font-weight', __prefix: 'xsl', __text: 'bold' },
     { _name: 'color', __prefix: 'xsl', __text: 'black' },
     { _name: 'font-family', __prefix: 'xsl', __text: 'sans' },
     { _name: 'text-decoration',
       __prefix: 'xsl',
       __text: 'underline' } ],
  _name: 'pagenum',
  __prefix: 'xsl' }

Обратите внимание, что объект "$ scope.ContentObj.stylesheet" является переменной "object" в песочнице.

0 голосов
/ 17 декабря 2018

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

{ attribute: [[{..},{..},{..}],{..},{..}],something }

и не так:

{ attribute: [{..},{..},{..},{..},{..}],something }.

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