JSON-поиск по ключам с именами переменных (неизвестно)


Total JSON noob здесь. Я пытаюсь прокрутить какой-то JSON, чтобы вытащить первое изображение из массива внутри объекта, и после 4 часов работы с ним я решил, что мне, вероятно, нужна помощь.

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

Структура Json неизвестный элемент структурирован следующим образом:

"custom_fields": {
    "content_0_subheading": [
      "Title text"
    ],
    "content_1_text": [
      "Some text"
    ],
    "content_2_image": [
      [
        "http://staging.livelivelyblog.assemblo.com/wp-content/uploads/2013/09/wellbeing-260x130.jpg",
        260,
        130,
        true
      ]
    ],
    "content_2_caption": [
      ""
        ]
}

То, что мне нужно, - это content_2_image в этом случае, но в другой записи это может быть content_20_image для всего, что я знаю (там много данных вытягивается).

Любые идеи о наилучшем способе циклического перебора этих неизвестных ключей, ищущих частичное совпадение на "_image" в ключе или что-то еще, были бы очень оценены.

Спасибо!

3 4

3 ответа:

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

var json = {
  "content_0_subheading": [
    "Title text"
  ],
  "content_1_text": [
    "Some text"
  ],
  "content_2_image": [
    [
      "http://staging.livelivelyblog.assemblo.com/wp-content/uploads/2013/09/wellbeing-260x130.jpg",
      260,
      130,
      true
    ]
  ],
  "content_2_caption": [
    ""
  ]
}

for (var key in json) {
    if (json.hasOwnProperty(key)) {
        if (/content_[0-9]+_image/.test(key)) {
            console.log('match!', json[key]); // do stuff here!
        }
    }
}

В основном, то, что мы делаем, это:

1) цикл через ключи объекта json for (var key in json)

2) Убедитесь, что у json есть свойство, и мы не обращаемся к ключам, которые нам не нужны if (json.hasOwnProperty(key))

3) проверьте, соответствует ли ключ регулярному выражению /content_[0-9]+_image/

3a) в основном, проверьте, соответствует ли он content_ANY NUMBERS_image где ANY NUMBERS равно по крайней мере одной цифре или более

4) Используйте эти данные, как вам заблагорассудится console.log(json[key])

Надеюсь, это поможет!

Можно использовать for ... in

for (key in object) {
    // check match & do stuff
}
var json = JSON.parse(YOUR_JSON_STRING).custom_fields, //Fetch your JSON
    image;                                             //Pre-declare image
for(key in json){                               //Search each key in your object
    if(key.indexOf("image") != -1){             //If the index contains "image"
        image = json[key];                //Then image is set to your image array
        break;                                  //Exit the loop
    }
}
/*
image[0]  //the URL
image[1]  //the width
image[2]  //the height
image[3]  //your boolean