Итерации по объекту JSON в JavaScript

У меня странный объект JSON. Я не уверен, как перебирать его, чтобы получить значения.

Я могу прочитать конкретное значение, но не знаю, что делать дальше.

 var sku_object = {
   "SkuDevices": {
      "cb_skus": [
         {
            "XCZU9EG-1E": [
               {
                  "x_speed_alias": [
                     {
                        "$": 1
                     }
                  ],
                  "x_speed": [
                     {
                        "$": 1
                     }
                  ],
                  "device_speed": [
                     {
                        "$": "1REL"
                     }
                  ],
                  "hardware_product": [
                     {
                        "$": "XCZU9EG"
                     }
                  ],
                  "device_grade": [
                     {
                        "$": "E"
                     }
                  ],
                  "status": [
                     {
                        "$": "Active"
                     }
                  ]
               }
            ],
            "XCZU9EG-2I-4522": [
               {
                  "x_speed": [
                     {
                        "$": 2
                     },
                     {
                        "$": 2
                     }
                  ],
                  "x_speed_alias": [
                     {
                        "$": 2
                     }
                  ],
                  "spec_class": [
                     {
                        "$": "SCD"
                     }
                  ],
                  "device_speed": [
                     {
                        "$": "2REL"
                     }
                  ],
                  "x_spec_suffix": [
                     {
                        "$": 4522
                     }
                  ],
                  "spec_name": [
                     {
                        "$": "SCD4522"
                     }
                  ],
                  "hardware_product": [
                     {
                        "$": "XCZU9EG"
                     }
                  ],
                  "x_silicon_stage": [
                     {
                        "$": "PROD"
                     }
                  ],
                  "device_grade": [
                     {
                        "$": "I"
                     }
                  ],
                  "status": [
                     {
                        "$": "Active"
                     }
                  ]
               }
            ]
         }
      ],
      "device": [
         {
            "$": "ZU9EG"
         }
      ]
   }
}

alert (sku_object.SkuDevices["cb_skus"][0]["XCZU9EG-1E"][0]["device_speed"][0]["$"])

Если вы видите последнюю строку, я могу прочитать конкретное значение.

Теперь в cb_skus -> XCZU9EG-1E и XCZU9EG-2I-4522 разные и это может быть что угодно.

Опять же, в XCZU9EG-2I-4522 количество атрибутов различается.

Пока могу только думать:

 for (var i = 0, len = sku_object.XxpubSkuDeviceCollection.cb_skus.length; i < len; ++i) {
     var ss= sku_object.XxpubSkuDeviceCollection.cb_skus[i];
     alert (ss["XCZU9EG-1E"][0]["device_speed"][0]["$"])
 }

На самом деле это не повторяется. Также как получить ключи типа "device_speed"?

Я должен был добавить, причина, по которой я пытаюсь перебрать его, - это создание объекта JSON со странными символами $. Что-то вроде этого:

{
    "device" : "zu9eg",
    "cb_skus" : {
            "XCZU9EG-1E" : {"hardware_product" : "XCZU9EG",
                            "device_speed" : "1REL",
                            "x_speed" : "1",
                            "device_grade" : "E",
                            "status" : "active"
            },
            "XCZU9EG-2I-4522" : {"hardware_product" : "XCZU9EG",
                                 "device_speed" : "2REL",
                                 "x_speed" : "2",
                                 "x_speed_alias" : "2",
                                 "device_grade" : "I",
           }
    }
}

Я должен был добавить, причина, по которой я пытаюсь перебрать его, - это создание объекта JSON со странными символами $. Что-то вроде этого:

user2351802 02.09.2018 16:28

{"device": "zu9eg", "cb_skus": {"XCZU9EG-1E": {"hardware_product": "XCZU9EG", "device_speed": "1REL", "x_speed": "1", "status": " active "}," XCZU9EG-2I-4522 ": {" hardware_product ":" XCZU9EG "," device_speed ":" 2REL "," x_speed ":" 2 "," x_speed_alias ":" 2 "," device_grade ":" I ",}}}

user2351802 02.09.2018 16:29

не могли бы вы отредактировать свой пост и добавить эту информацию, пожалуйста

JSmith 02.09.2018 16:33

Начните с stackoverflow.com/questions/8312459/….

Jim Janney 02.09.2018 16:55

Задавая вопрос, пожалуйста, обратитесь к руководству на странице Как задать хороший вопрос. Я не вижу здесь никаких свидетельств исследовательская работа.

D.B. 02.09.2018 17:02

@JSmith: Исправил пост.

user2351802 02.09.2018 17:19

@JimJanney - Спасибо, я посмотрю и попробую.

user2351802 02.09.2018 17:19

JSON - это всегда String, а не Object.

connexo 02.09.2018 20:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Затем сформируйте новые объекты с вложенными свойствами для простых двухуровневых свойств.

function final(a) {
    return '$' in a[0]
        ? a[0].$
        : Object.assign(
            ...a.map(o =>
                Object.assign(...Object.entries(o).map(([k, v]) => ({ [k]: final(v) })))
            )
        );
}

var sku_object = { SkuDevices: { cb_skus: [{ "XCZU9EG-1E": [{ x_speed_alias: [{ $: 1 }], x_speed: [{ $: 1 }], device_speed: [{ $: "1REL" }], hardware_product: [{ $: "XCZU9EG" }], device_grade: [{ $: "E" }], status: [{ $: "Active" }] }], "XCZU9EG-2I-4522": [{ x_speed: [{ $: 2 }, { $: 2 }], x_speed_alias: [{ $: 2 }], spec_class: [{ $: "SCD" }], device_speed: [{ $: "2REL" }], x_spec_suffix: [{ $: 4522 }], spec_name: [{ $: "SCD4522" }], hardware_product: [{ $: "XCZU9EG" }], x_silicon_stage: [{ $: "PROD" }], device_grade: [{ $: "I" }], status: [{ $: "Active" }] }] }], device: [{ $: "ZU9EG" }] } },
    result = final([sku_object.SkuDevices]);

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

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

user2351802 04.09.2018 16:31
Ответ принят как подходящий

Если для получения объекта используется JSON.parse, значения можно изменить с помощью параметр оживления:

var j = '{"SkuDevices":{"cb_skus":[{"XCZU9EG-1E":[{"x_speed_alias":[{"$":1}],"x_speed":[{"$":1}],"device_speed":[{"$":"1REL"}],"hardware_product":[{"$":"XCZU9EG"}],"device_grade":[{"$":"E"}],"status":[{"$":"Active"}]}],"XCZU9EG-2I-4522":[{"x_speed":[{"$":2},{"$":2}],"x_speed_alias":[{"$":2}],"spec_class":[{"$":"SCD"}],"device_speed":[{"$":"2REL"}],"x_spec_suffix":[{"$":4522}],"spec_name":[{"$":"SCD4522"}],"hardware_product":[{"$":"XCZU9EG"}],"x_silicon_stage":[{"$":"PROD"}],"device_grade":[{"$":"I"}],"status":[{"$":"Active"}]}]}],"device":[{"$":"ZU9EG"}]}}'

var o = JSON.parse(j, (k, v) => v.map ? v[0] : v.$ || v)

console.info( o )

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

var json = '{"SkuDevices":{"cb_skus":[{"XCZU9EG-1E":[{"x_speed_alias":[{"$":1}],"x_speed":[{"$":1}],"device_speed":[{"$":"1REL"}],"hardware_product":[{"$":"XCZU9EG"}],"device_grade":[{"$":"E"}],"status":[{"$":"Active"}]}],"XCZU9EG-2I-4522":[{"x_speed":[{"$":2},{"$":2}],"x_speed_alias":[{"$":2}],"spec_class":[{"$":"SCD"}],"device_speed":[{"$":"2REL"}],"x_spec_suffix":[{"$":4522}],"spec_name":[{"$":"SCD4522"}],"hardware_product":[{"$":"XCZU9EG"}],"x_silicon_stage":[{"$":"PROD"}],"device_grade":[{"$":"I"}],"status":[{"$":"Active"}]}]}],"device":[{"$":"ZU9EG"}]}}';

var obj = JSON.parse(json, 
  function(key, value) {                               // for each parsed value, 
    if ( Array.isArray(value) ) { return value[0]; }   // if the value is array, return the first item. For example, [1, 2] becomes 1
    else if ( value.hasOwnProperty('$') ) { return value['$']; }    // if the value has a property "$", return it's value. For example, { "$": 1, "a": 2 } becomes 1
    else return value;                                 // otherwise, return the value unchanged for the rest of the values
  }
);

console.info( obj );

Приносим извинения за задержку с ответом. Это волшебство. Не могли бы вы объяснить, как работает "(k, v) => v.map? V [0]: v. $ || v"? Спасибо

user2351802 04.09.2018 16:30

Блестяще. Большое спасибо за объяснение. Не уверен, почему эта строка «else if ('$' in value) {return value ['$'];}» показывает ошибку при тестировании в онлайн-тестере webtoolkitonline.com/javascript-tester.html

user2351802 05.09.2018 19:45

правда, я должен был проверить. in не работает для типов значений

Slai 05.09.2018 19:55

Другие вопросы по теме