微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

试图获取数组内部结构的值

如何解决试图获取数组内部结构的值

在Java或cfm中寻找一个线性代码在这里我不需要遍历te的结构数组即可使用te structfind从中获取值。

现在看着它,

Coldfusion - How to loop through an Array of Structure and print out dynamically all KEY values?

我可以在其中循环并获取键匹配的值

但是尝试检查是否可以完成这样的操作

<cfset myvalue = structfindvaluefromAnything(myarrayofstruct,"infor")>

解决方法

如果您真的想在一行中执行此操作,则可以将ArrayFilter()StructFindValue()结合使用。

从Adobe文档改编为ArrayFilter-https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-a-b/arrayfilter.html-类似:

<cfscript>
     superheroes=[
           {"name":"Iron Man","member":"Avengers"},{"name":"Wonder Woman","member":"Justice League"},{"name":"Hulk",{"name":"Thor",{"name":"Aquaman","member":"Justice League"}
     ];
 
    avengers=ArrayFilter(superheroes,function(item){ 
        return ArrayLen(StructFindValue( item,"Avengers"));
    });
    writeDump(var=avengers,label="all matches");

    writeDump(var=ArrayLen(avengers) ? avengers[1] : "Not found",label="first match only");

    writeDump(var=structFindValue({"a":superheroes},"Avengers","all"),label="without arrayFilter");
</cfscript>
,

我喜欢Sev的方法。我会稍作更改

<cfscript>
     superheroes=[
           {"name":"Iron Man",{"name":"Spider-Man","member":"Justice League"}
     ];
 
     avengers = superheroes.filter(function(item) { 
        return item.member ==  "Avengers";
    });
     writeDump(avengers);
</cfscript>
,

我相信此功能几乎与您所希望的...

StructFindValue(struct,value [,scope])

通过嵌套数组,结构和其他元素的子结构递归搜索具有与value参数中的搜索键匹配的值的结构。

返回一个数组,该数组包含其值与搜索键值匹配的结构键。如果找不到,则返回大小为0的数组。

,

根据您上面提供的要旨(https://cffiddle.org/app/file?filepath=3e26c1ac-d5db-482f-9bb2-995e6cabe704/49b3e106-8db9-4411-a6d4-10deb3f8cb0e/24e44eba-45ef-4744-a6e6-53395c09a344.cfm),我认为您已经澄清了一些期望。

根据您的要旨,您说您希望能够搜索结构体数组并找到具有"name"值的"form"键的行。然后,您要获取与数组行中的该结构关联的"value"键的值。如果没有value,则返回0

您希望能够在一行代码中完成此操作,以上答案确实可以实现这一点。我的回答基本上基于这些。

如前面的答案所示,您仍然希望使用闭包函数来过滤最终输出。这些程序非常快,并且本质上可以完成您要尝试做的事情。

我合作过的小提琴在这里:https://cffiddle.org/app/file?filepath=b3507f1d-6ac2-4900-baed-fb3faf5a3b3a/e526afc2-bb85-4aea-ad0e-dcf38f52b642/75d88d2b-f990-44c1-9d9f-22931bf9d4d7.cfm

我已经做了两件事。

首先,我进行了处理,就好像您希望遇到多个记录以获取过滤值,然后将它们转换为以逗号分隔的列表一样。如果您需要其他结构,可以修改我代码中的reduce()函数来处理。

第二,我像您期望只遇到一条过滤的记录一样,只返回一个值。

我做的第一件事,就是在两种方法中都大体相同,并且与前面的答案基本相同,就是过滤原始数组以获得所需的值。

这是这样完成的:

myResult = originalArray.filter( 
    function(itm){ 
        return itm?.name=="form";   /// ?. = safe-navigation operator.
    } 
)

为了清楚起见,我将其分为多行。

这将返回一个新的结构数组,其中包含您已过滤的行。

但是您想获取这些记录并从这些行中返回"value"(如果没有值,则默认为0。您可以使用reduce()来做到这一点。

commaDelimitedValue = 
    myResult.reduce( 
        function(prev,nxt) { 
            return prev.listappend( ( nxt.value.len() ? nxt.value : 0 ) ) ;
        },""   /// Initialization value 
    ) ;

同样,它可以写成一行,但是为了清楚起见,我加入了换行符。

reduce()函数实际上只是将您的输入减小为单个值。它遵循.reduce( function( previousValue,nextValue ){ return .... },<initializationValue>)的格式,其中在第一次迭代中,将initializationValue替换为previousValue,然后previousValue成为该迭代的结果。 nextValue实际上是您将从中得出结果的当前迭代。

更多信息:https://coldfusion.adobe.com/2017/10/map-reduce-and-filter-functions-in-coldfusion/

根据我的假设,您可能从filter()返回了多行。您将这些行放入value并以逗号分隔的列表之后。因此,您最终会得到类似20,10,0的结果-在过滤的结果中代表4行。

我还检查了value的长度,如果它是一个空字符串,则默认为0。上面我说过,您可以在上面使用Elvis运算符(:?),但这不适用于像空字符串这样的简单值。猫王使用NULL s,早期的数组确实有。

要将其放回一行,可以链接这两个函数。因此,您最终得到:

myFinalResult =  
    myOriginalArray.filter( 
        function(itm){ 
            return itm?.name=="form";
        } 
    )
    .reduce(   
        function(prev,nxt) { 
            return prev.listappend( ( nxt.value.trim().len() ? nxt.value : 0 ) ) ;
        },""
    ) 
;

同样,该代码做了很多事情,但实际上仍然是一行。最终的结果将再次是类似"20,0"的4行,其中2行默认为0

如果只希望过滤器返回单个行,或者只希望单个值,则可以简化一点。

myFinalResult = myOriginalArray.filter( function(itm){ return itm?.name=="fm" && (itm?.value.trim().len()>0) ; } )[1]["value"] ?: 0 ;

有了这个,我将回到上一次使用Elvis的技巧来默认不包含value的行,因为我正在使用空字符串"form"过滤掉"value"结构。 &&AND相同。从技术上讲,此 CAN 可以过滤原始数组中的多个行,但是[1]仅从过滤后的行中选择第一行。它也不需要使用reduce()。如果过滤的行多于一个,则每次迭代都将覆盖前一行。

这将返回一个简单的单一值,类似于42-这是数组中最后一个过滤后的值,因为它会覆盖前一行的值。

“我的小提琴(https://cffiddle.org/app/file?filepath=b3507f1d-6ac2-4900-baed-fb3faf5a3b3a/e526afc2-bb85-4aea-ad0e-dcf38f52b642/75d88d2b-f990-44c1-9d9f-22931bf9d4d7.cfm)还有一些其他评论,我设置了一些边沿案例来演示过滤和安全导航。


我还要重申,如果是Lucee 5+或ACF2018 +,您可以使用箭头功能进一步缩短。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。