Конвертировать ColdFusion Struct - назначить пользовательский ключ

Я новичок в языке CFML, и у меня есть вопрос, касающийся структур и массивов в ColdFusion. Обратите внимание, что я использую OpenBD CFML-сервер.

У меня есть следующий объект (структура):

{
   "docs":{
      "23_id":{
         "content":[
            "I am"
         ]
      },
      "1_id":{
         "content":[
            "the most"
         ]
      },
      "7_id":{
         "content":[
            "crap coder"
         ]
      },
      "39_id":{
         "content":[
            "in the whole universe!"
         ]
      }
   }
}

Вопрос: могу ли я изменить вышеуказанный объект (и, если возможно, сохранить порядок):

{
    "docs": [
        {
            "id": "23_id",
            "lola": "I am"
        },
        {
            "id": "1_id",
            "lola": "the most"
        },
        {
            "id": "7_id",
            "lola": "crap coder"
        },
        {
            "id": "39_id",
            "lola": "in the whole universe!"
        }
    ]
}

Обратите внимание, что мне нужно назначить пользовательские ключи (идентификатор и назначить "lola" вместо "содержимого"). Есть ли какие-либо указатели для изучения, чтобы выполнить вышеупомянутую задачу? Любая помощь приветствуется!

3 ответа

Легко, создайте новый массив, зациклите вашу структуру и добавьте массив так, как вы делаете:

<cfset str = {
   "docs":{
      "23_id":{
         "content":[
            "I am"
         ]
      },
      "1_id":{
         "content":[
            "the most"
         ]
      },
      "7_id":{
         "content":[
            "crap coder"
         ]
      },
      "39_id":{
         "content":[
            "in the whole universe!"
         ]
      }
   }
}>

<cfset docs = { docs: []}>

<cfloop collection="#str.docs#" item="itm">
    <cfset arrayAppend( docs.docs, {id: itm, lola: str.docs[itm].content[1]} )>
</cfloop>

<cfdump var="#serializeJson(docs)#">

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

По сути, вы хотите создать новый пустой массив: []. Затем переберите ключи внутри документов (используйте cfloop collection="..."). Для каждого ключа добавьте структуру в ваш массив, чтобы ваш результат был массивом структур. Затем вставьте это в исходную переменную. Не может быть конкретным без имен переменных.

Вы можете определенно сделать то, что вы говорите, что вы хотите сделать в приведенном выше коде. В результате вы получите массив с именем doc, каждый индекс которого будет содержать структуру с ключом ID и ключом LOLA. Если это то, что вы хотите, то ваш код выше будет работать.

Я бы сказал, что ваша конструкция данных выглядит так, как будто она может извлечь выгоду из чего-то другого - возможно, объекта запроса. Но, возможно, XML или JSON будет хорошим выбором. Это выглядит немного замученным:)

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