我遇到的问题是我用于此特定项目的 API 在键中使用句点,这在查询列名称中是不允许的。所以我需要找到一种方法来重命名数组键以删除句点(或用下划线替换它们)。这是我到目前为止的代码,它可以工作,但在点击“accumulator.addRow”行时会抛出错误。错误是列名称中不允许使用句点。
<cfset varResults = '[{"roW_NUMBER":1,"membership.Individual.LocalID":999,"membership.Individual.FirstName":"AA","membership.Individual.LastName":"AA","membership.Individual.Company":null,"membership.Individual.Work_Address_Line1":"aaaa","membership.Individual.Work_Address_Line2":null,"membership.Individual.Work_Address_City":"Alexandria","membership.Individual.Work_Address_State":"VA","membership.Individual.Work_Address_PostalCode":"9999-2518","membership.Individual.Work_Address_CountryName":"UNITED STATES","membership.Individual.EmailAddress":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2b6a6a056a6a6b4c464a424705484446" rel="noreferrer noopener nofollow">[email protected]</a>","membership.Type.Name":"Regular","membership.JoinDate":"2009-05-01T00:00:00","membership.ExpirationDate":"2023-04-30T00:00:00","membership.Individual.FellowElectDate__c":null,"chapter.Name":"DDDD","id":"0e04bc98-0074-cc58-bf6a-0b438d800e7d"},{"roW_NUMBER":2,"membership.Individual.LocalID":9998,"membership.Individual.FirstName":"AA","membership.Individual.LastName":"AA","membership.Individual.Company":null,"membership.Individual.Work_Address_Line1":"ASASASAAASAS","membership.Individual.Work_Address_Line2":null,"membership.Individual.Work_Address_City":"Washington","membership.Individual.Work_Address_State":"DC","membership.Individual.Work_Address_PostalCode":"9999","membership.Individual.Work_Address_CountryName":"UNITED STATES","membership.Individual.EmailAddress":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a0e1f3e1f3e1f3e1e0c7cdc1c9cc8ec3cfcd" rel="noreferrer noopener nofollow">[email protected]</a>","membership.Type.Name":"Regular","membership.JoinDate":"2020-01-01T00:00:00","membership.ExpirationDate":"2022-12-31T00:00:00","membership.Individual.FellowElectDate__c":null,"chapter.Name":"DDDD","id":"0e04bc98-0074-c1ae-f171-0b438d800e7c"}]'>
<cfscript>
function arrayToQuery(varChapterRoster) {
return varChapterRoster.reduce(function(accumulator, element) {
element.each(function(key) {
if (!accumulator.keyExists(replace(key,".","_","all"))) {
accumulator.addColumn(replace(key,".","_","all"), []);
}
});
//writeDump(element);
accumulator.addRow(element);
return accumulator;
}, QueryNew(""));
}
// writeDump(varChapterRoster);
writeDump(arrayToQuery(varChapterRoster));
</cfscript>
特定错误:列名称必须是有效的变量名称。它们必须以字母开头,并且只能包含字母、数字和下划线。
我通过使用替换函数绕过了“keyexists”和“addcolumn”行,但替换对 addRow 行上的“element”不起作用(引发错误)。
改变策略,这里是CFFiddle其中包含我现在正在尝试的方法的一些虚拟数据。我认为这更直接,但我打赌再次出现与周期相关的另一个错误。
最佳答案
<cfset varResults = '[{"roW_NUMBER":1,"membership.Individual.LocalID":999,"membership.Individual.FirstName":"AA","membership.Individual.LastName":"AA","membership.Individual.Company":null,"membership.Individual.Work_Address_Line1":"aaaa","membership.Individual.Work_Address_Line2":null,"membership.Individual.Work_Address_City":"Alexandria","membership.Individual.Work_Address_State":"VA","membership.Individual.Work_Address_PostalCode":"9999-2518","membership.Individual.Work_Address_CountryName":"UNITED STATES","membership.Individual.EmailAddress":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="084949264949486f65696164266b6765" rel="noreferrer noopener nofollow">[email protected]</a>","membership.Type.Name":"Regular","membership.JoinDate":"2009-05-01T00:00:00","membership.ExpirationDate":"2023-04-30T00:00:00","membership.Individual.FellowElectDate__c":null,"chapter.Name":"DDDD","id":"0e04bc98-0074-cc58-bf6a-0b438d800e7d"},{"roW_NUMBER":2,"membership.Individual.LocalID":9998,"membership.Individual.FirstName":"AA","membership.Individual.LastName":"AA","membership.Individual.Company":null,"membership.Individual.Work_Address_Line1":"ASASASAAASAS","membership.Individual.Work_Address_Line2":null,"membership.Individual.Work_Address_City":"Washington","membership.Individual.Work_Address_State":"DC","membership.Individual.Work_Address_PostalCode":"9999","membership.Individual.Work_Address_CountryName":"UNITED STATES","membership.Individual.EmailAddress":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1a5b495b495b495b5a7d777b737634797577" rel="noreferrer noopener nofollow">[email protected]</a>","membership.Type.Name":"Regular","membership.JoinDate":"2020-01-01T00:00:00","membership.ExpirationDate":"2022-12-31T00:00:00","membership.Individual.FellowElectDate__c":null,"chapter.Name":"DDDD","id":"0e04bc98-0074-c1ae-f171-0b438d800e7c"}]'>
<cfset varResults = replace(varResults,":null",':""',"All")>
<cfset varResults = replace(varResults,"T00:00:00","","All")>
<cfset varResults = deserializeJSON(varResults)>
根据原帖回答。 Demo
<cfscript>
function arrayToQuery(varChapterRoster) {
if(varChapterRoster.len() == 0){
return QueryNew('');
}
return varChapterRoster.reduce(function(accumulator, element) {
Row = QueryAddRow(accumulator);
element.each(function(key) {
QuerySetCell( accumulator , replace(key,".","_","all") , element[key] , Row );
});
return accumulator;
}, QueryNew(replace(StructKeyList(varResults[1]),".","_","all")));
}
// writeDump(varChapterRoster);
writeDump(arrayToQuery(varResults));
</cfscript>
根据你的cffiddle回答。 Demo
<cfif NOT ArrayLen(varResults)>
<cfthrow message="No data" />
</cfif>
<cfset Q = QueryNew( replace(StructKeyList(varResults[1]),".","_","all") ) />
<cfloop index="item" array="#varResults#">
<cfset Row = QueryAddRow(Q) />
<cfloop item="ColName" collection="#item#" >
<cfset QuerySetCell( Q , replace(ColName,".","_","all") , item[ColName] , Row ) />
</cfloop>
</cfloop>
<cfdump var=#Q# />
关于multidimensional-array - 在 Coldfusion 中创建函数以将多维数组动态转换为查询对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72971904/