multidimensional-array - 在 Coldfusion 中创建函数以将多维数组动态转换为查询对象

标签 multidimensional-array coldfusion

我遇到的问题是我用于此特定项目的 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/

相关文章:

c - 使用 3D 数组 - 无法进行输出

javascript - 用定长多维数组填充Javascript对象

java - 添加大型查询时如何修复 SpreadSheetAddRows 函数崩溃?

jakarta-ee - ColdFusion 9 多服务器设置 : setting application name prevents session replication

arrays - 在将结构插入数组之前测试结构是否存在的最佳方法是什么?

arrays - 在 F# 接口(interface)中实现 GetSlice 进行切片

php - 分组输出多维数组

python - 计算 Python 中多维数组中达到或超过阈值的次数

javascript - 尝试在 ajax 函数中使用触发我的 .click 函数的同一页面中的 id

mysql - 不要使用 coldfusion 将空白/空字段插入数据库