【问题标题】:loop over a query to create an Manual ArryOfStructs Data循环查询以创建手动 ArryOfStructs 数据
【发布时间】:2022-02-06 16:05:01
【问题描述】:

我有一个查询数据,想用它创建一个手动的结构数组,我正在使用这段代码,但它似乎是错误的。我在这里缺少什么应该在这里做什么

for(i in myquery) {
                st['Contact'][#i#]['ID'] = i.id;
                st['Contact'][#i#]['Name'] = i.name;
                st['Contact'][#i#]['Email'] = i.email;
            }

【问题讨论】:

  • 什么不起作用?你认为#i#会做什么?

标签: coldfusion lucee


【解决方案1】:

您的代码中有一些问题。我将把它分解:

假设您有如下查询结果:

myquery= queryNew(
            "id, name, email",
            "integer,varchar,varchar",
            [ 
                {"id":43,"name":"Antonio", "email": "antonio@somedomain.com"}, 
                {"id":65,"name":"Manuel", "email": "manuel@somedomain.com"}, 
                {"id":77,"name":"Paula", "email": "paula@somedomain.com"},
                {"id":87,"name":"Jennifer", "email": "Jennifer@somedomain.com"}
                
            ]);

然后像你做的那样用for( row in query ) 遍历(循环)你的查询是行不通的:

    for( i in myquery ){
       st['Contact'][#i#]['ID'] = i.id;
       st['Contact'][#i#]['Name'] = i.name;
       st['Contact'][#i#]['Email'] = i.email;
    }

原因:

  • 使用for( row in myquery ) 时,您正在逐行迭代查询。但是在您的循环中,您想使用索引i 来设置您的数组。然后,i 将不是您期望的数字整数,而是一个完整的行集。它将尝试使用完整的行作为索引,这不应该工作。如果您需要索引,您还必须按索引迭代查询,例如与for (i = 1; i <= myquery.recordCount; i++)。作为参考,请参阅如何按索引迭代查询,请参阅 cfdocs here,或者在不使用任何索引的情况下使用 ArrayAppend()append() 成员。
  • 您需要先将st['Contact'] 预定义为带有st['Contact']=[]; 的数组,否则CF 会认为它是一个结构体
  • 此外,您正在使用i 设置数组,但使用[#i#] 输出它而不带任何引号。在输出中使用# 包含这样的引号:st['Contact']['#i#']['ID'] 或不包含这样的引号:st['Contact'][i]['ID']。但不是像 st['Contact'][#i#]... 这样的。

更正您的代码以使 st.Contact 填充为数组,它可能类似于:

备选方案一:使用ArrayAppend()append()成员函数:

st['Contact']=[]; 
for ( i in myquery ) {
      st['Contact'].append( 
         {"id": myquery.id,
         "name": myquery.name,
         "email": myquery.email
         });
    }

相同但更简单:

st['Contact']=[]; 
for ( i in myquery ) {
      st['Contact'].append( i );
    }

备选方案2:使用for (i = 1; i <= myquery.recordCount; i++)按索引迭代查询

st['Contact']=[]; 
for (i = 1; i <= myquery.recordCount; i++) {
    st['Contact'][i]['ID'] = myquery.id[i];
    st['Contact'][i]['Name'] = myquery.name[i];
    st['Contact'][i]['Email'] = myquery.email[i];
            }

如果您在我提交的查询的帮助下转储变量st,您将获得以下数据结构(这里只是字符串化的):

{"Contact":[
    {"Name":"Antonio","ID":43,"Email":"antonio@somedomain.com"},
    {"Name":"Manuel","ID":65,"Email":"manuel@somedomain.com"},
    {"Name":"Paula","ID":77,"Email":"paula@somedomain.com"},
    {"Name":"Jennifer","ID":87,"Email":"Jennifer@somedomain.com"}
    ]}

这是两种替代方案的完整 cfscript 代码:


myquery= queryNew(
            "id, name, email",
            "integer,varchar,varchar",
            [ 
                {"id":43,"name":"Antonio", "email": "antonio@somedomain.com"}, 
                {"id":65,"name":"Manuel", "email": "manuel@somedomain.com"}, 
                {"id":77,"name":"Paula", "email": "paula@somedomain.com"},
                {"id":87,"name":"Jennifer", "email": "Jennifer@somedomain.com"}
                
            ]);
            
st['Contact']=[]; 
for ( i in myquery ) {
      st['Contact'].append( 
         {"id": myquery.id,
         "name": myquery.name,
         "email": myquery.email
         });
    }
dump(st);

// simplier version of above
st['Contact']=[]; 
for ( i in myquery ) {
      st['Contact'].append( i );
    }
dump(st);


st['Contact']=[]; 
for (i = 1; i <= myquery.recordCount; i++) {
    st['Contact'][i]['ID'] = myquery.id[i];
    st['Contact'][i]['Name'] = myquery.name[i];
    st['Contact'][i]['Email'] = myquery.email[i];
}
dump(st);

【讨论】:

  • var aData = []; for(i in myquery) { tmpStruct = {}; tmpStruct['ID'] = i.id; arrayAppend(aData, tmpStruct); } st['QueryData'] = aData;
猜你喜欢
  • 1970-01-01
  • 2017-06-16
  • 2016-08-16
  • 2022-01-20
  • 2019-07-28
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多