积累工作不会的_2024_04
20240401,
-
1.
ap服务feign接口调用us服务A接口超时,排查思路:
-
1.
System.currentTimeMillis()来打出feign客户端发请求、服务端接收请求时间点,算出ap服务调us服务A接口所用时间,
-
2.
测试ap服务调us服务B接口所用时间,测出调us服务都有问题
-
3.
测试le服务调us服务A接口所用时间
-
4.
测试le服务调sy服务所用时间,定位出是us服务有问题
-
20240409,
2024-04-09,
-
1.
理解vue里的@
project/ |-- src/ | |-- components/ | | |-- MyComponent.vue | |-- views/ | | |-- MyView.vue | |-- main.js |-- public/ |-- ...
-
1.
在MyView.vue里引入MyComponent.vue:
import MyComponent from '../components/MyComponent.vue'; // 更方便的写法 // import MyComponent from '@/components/MyComponent.vue';
-
2.
@是别名,通常用于表示src目录的绝对路径
-
排查地图有的图片空白:F12里排查每个获取瓦片图片请求都正常返回了图片,进而放大缩小地图排查,定位问题为图片显示错乱。原因是没引入必要的库和样式。
需要在项目main.js中引入leaflet,挂载到Vue上,便于全局使用
2024-04-09,
/* 查业务表中 附件个数大于1的 业务记录 */ /* 先group by,再having */ select t.id, t.multi_busi_id from 业务表 t join 附件表 s on t.multi_busi_id = s.busi_id group by t.multi_busi_id, t.id -- 这里需要列出业务表a中除了multi_busi_id之外的所有你想要查询的字段 having count(s.busi_id) > 1;
2024-04-10,
-
1.
js文件里函数间直接调用
function sum(a,b) {return a + b;} function test(a, b) {let res = sum(a, b); console.log(res);} test(1, 2) // 输出3
-
1.
前端base64转文件:base64先转成Blob对象(假如名为a),再由a构建jpeg格式的新的Blob对象b
-
2.
前端获取Blob对象(假如名为b)的大小:b.size
-
1.
在JavaScript中,
Blob
对象代表了一段不可变的原始数据,这些数据可以是文本或二进制数据。Blob
对象有一个size
属性,它返回Blob对象中所包含数据的字节数。当你有一个
Blob
对象b
时,你可以通过访问b.size
来获取这个Blob对象的大小,单位是字节。
-
-
3.
JOIN
语句用于将业务表a
和附件表b
连接起来,基于multi_busi_id
和busi_id
字段的匹配。-
1.
GROUP BY
语句用于按业务表的multi_busi_id
字段(以及你可能想要查询的其他业务表字段)进行分组。 -
2.
HAVING
子句用于过滤出那些附件数量大于1的分组。
-
-
4.
存电子签名3种方案评估:
-
1.
直接保存成base64存到业务表上:
-
•
优点:查询方便,因为签名数据直接和业务记录关联在一起,无需额外的JOIN操作。
-
•
缺点:base64编码会增加数据的大小,可能会导致业务表变得很大,影响查询和存储性能。此外,如果业务表非常大,每次查询时都需要加载额外的签名数据,可能会降低性能。
-
-
2.
存到附件表里存成base64:
-
•
优点:将签名数据与业务数据分开存储,保持业务表的简洁。同时,如果需要查看或处理签名数据,可以通过与附件表的关联查询来获取。
-
•
缺点:与直接保存在业务表上相似,base64编码会增加数据的大小。此外,如果经常需要查询签名数据,需要频繁进行JOIN操作,可能影响性能。
-
-
3.
存到附件表里存成图片例如png或jpg:
-
•
优点:图片格式是常见的电子签名存储方式,可以方便地通过文件管理系统或CDN进行存储和访问。同时,图片格式通常比base64编码更加紧凑,节省存储空间。此外,如果需要展示签名,图片格式更加直观和方便。
-
•
缺点:需要额外的存储和管理图片的设施,可能增加系统的复杂性和维护成本。同时,如果经常需要查询签名数据,仍然需要进行JOIN操作,可能影响性能。
-
-
-
1.
将图片存到ftp上优于直接(例如base64格式)存数据库的分析:
-
1.
存储效率:FTP服务器专门用于文件存储,通常比数据库更适合存储大量二进制数据(如图片)。数据库更适合存储结构化数据,而将文件路径存储在数据库中可以保持数据库的简洁和高效。
-
2.
性能:当需要访问附件时,系统可以直接从FTP服务器获取文件,而不需要从数据库中检索大量的base64编码数据或图片二进制数据。这可以减少数据库的负载并提高性能。
-
-
1.
先写group by还是先写having:
-
1.
在SQL查询中,
GROUP BY
和HAVING
子句是经常一起使用的,但它们的使用顺序是固定的。正确的顺序是先写
GROUP BY
,然后再写HAVING
。GROUP BY
子句用于将结果集中的行组合成摘要行,通常与聚合函数(如SUM()
,COUNT()
,AVG()
等)一起使用。它定义了如何对结果集进行分组。HAVING
子句用于过滤由GROUP BY
子句返回的分组。它类似于WHERE
子句,但WHERE
子句不能用于过滤聚合函数的结果,而HAVING
可以。
-
-
1.
前端报错“This relative module was not found:* ./LeafletTiandituMap in ./node_modules/“,这种报错很可能是文件路劲错误导致的
-
2.
浏览器地图渲染有问题,可以考虑是否是CSS样式冲突
android studio打开项目报错“Missing Gradle Project Information. Please check if the IDE successfully synchronized its state with the Gradle Project Model.”:
-
1.
这条消息表明你的集成开发环境(IDE,如IntelliJ IDEA、Android Studio等)未能成功地与Gradle项目模型同步其状态。Gradle是一个用于自动化构建工具,而IDE同步是确保IDE能够正确识别和理解Gradle项目结构、依赖和其他配置的过程。
通过点击clean project菜单,android studio重新下载了相关包,报错解决了
2024-04-11,
-
1.
android studio打开原生项目,项目根目录下的app文件夹是干什么的:
-
1.
在 Android Studio 中,当你打开一个原生 Android 项目时,通常你会在项目的根目录下看到一个名为
app
的文件夹。这个app
文件夹是一个模块,代表了你的 Android 应用的主要部分。具体来说,它包含了构建这个 Android 应用所需的大部分代码和资源。以下是
app
文件夹中通常包含的一些关键组件和文件:-
1.
src/main/: 这里存放着应用的主要源代码。
-
•
java/ 或 kotlin/: 存放着应用的 Java 或 Kotlin 源代码文件。
-
•
res/: 存放着应用的资源文件,如布局文件(XML)、图片、字符串等。
-
•
AndroidManifest.xml: 应用的清单文件,它描述了应用的基本属性和所需的权限。
-
-
2.
build.gradle: 这是一个 Gradle 构建脚本,用于配置项目的构建过程。它定义了项目的依赖、构建变体、签名配置等。
-
3.
libs/: 这个文件夹通常用于存放项目直接依赖的 JAR 文件或其他库文件。但在现代的 Android 项目中,依赖通常是通过 Gradle 来管理的,因此这个文件夹可能不是必需的。
-
4.
proguard-rules.pro: 如果你使用了 ProGuard 来进行代码混淆,这个文件就包含了混淆规则。
app
模块通常包含了应用的主要功能和用户界面。一个 Android 项目可以有多个模块,但app
模块通常是主模块,包含了启动 Activity 和其他核心功能。在开发过程中,你大部分时间都会在这个
app
文件夹中工作,编写代码、创建布局、添加资源等。当你构建项目时,Android Studio 会根据build.gradle
文件中的配置来编译和打包app
模块,生成最终的 APK 文件。 -
-
-
2.
app模块下src/main/java下有两个包:”cn.集团名.app.项目名“和com.customer
-
1.
在 Android Studio 的项目中,
src/main/java
目录是存放 Java 源代码的地方。当你看到app
模块下的src/main/java
目录下有两个包(package),cn.集团名.app.
项目名 和com.customer
,这通常意味着项目的代码是按照某种逻辑或功能进行组织的。每个包(package)在 Java 中是一个命名空间,用于防止类名冲突,并帮助组织和管理代码。在大型项目中,代码会被划分到不同的包中,以便更好地管理和维护。
cn.集团名.app.
项目名 和com.customer
这两个包可能代表了不同的功能模块或业务逻辑:-
•
cn.集团名.app.
项目名 可能是一个特定的功能模块。这里的命名方式暗示了 "集团名“可能是公司名称或项目名称的缩写,而 "项目名" 则代表了这个包的功能或业务领域。 -
•
com.customer
则可能包含与客户相关的代码,如客户信息管理、客户服务等。这里的com
通常是一个常见的顶级域名,用于命名组织或个人的包,而customer
则直接说明了包的功能。
在实际开发中,你可能会根据项目的需求将代码划分到不同的包中。例如,你可能会有一个包用于处理网络请求,一个包用于处理数据库操作,另一个包用于定义 UI 组件等。
要理解每个包的具体功能和作用,你需要查看每个包中的类和方法,并阅读相关的文档或注释。这样,你才能更好地理解项目的结构和各个组件之间的交互方式。
-
-
-
3.
我在com.customer.plugins.apploc包下定义了A:public class A extends CordovaPlugin。然后在app/src/main/res/xml/config.xml里定义如下,帮我分析一下是什么意思: <feature name="S"> <param name="android-package" value="com.customer.plugins.a.A" /> </feature>
-
1.
在 Apache Cordova(或 PhoneGap)项目中,
config.xml
文件是项目的配置文件,它包含了应用的元数据、插件定义以及其他设置。这个文件对于 Cordova 项目的构建和运行至关重要。在你提供的
config.xml
片段中:xml复制代码<feature name="S"> <param name="android-package" value="com.customer.plugins.a.A" /> </feature>
你定义了一个名为
S
的 Cordova 插件特性。这个定义告诉 Cordova,当应用需要用到S
功能时,它应该使用在android-package
参数中指定的 Android 类。具体解释如下:
-
•
<feature name="S">
: 这里定义了一个插件特性,其名称为S
。这个名称在 JavaScript 代码中可能会被引用,以调用该插件提供的功能。 -
•
<param name="android-package" value="com.customer.plugins.a.A" />
: 这是一个参数标签,它指定了 Android 平台上实现这个特性的具体类。android-package
参数的值com.customer.plugins.a.A
是你的A
类的完整类名。这意味着,当 Cordova 应用在 Android 设备或模拟器上运行时,并且 JavaScript 代码尝试访问S
功能时,Cordova 会寻找并调用com.customer.plugins.a.A
类中的相应方法。
在你提供的
A
类定义中:java复制代码public class A extends CordovaPlugin { // ... 类成员和方法 ... }
你创建了一个继承自
CordovaPlugin
的类。这意味着你的A
类是一个 Cordova 插件,它应该实现了一些方法,这些方法可以通过 JavaScript 调用,以执行特定的原生 Android 功能。为了使
A
正常工作,你还需要在A
类中重写CordovaPlugin
的方法,如execute
方法,以处理 JavaScript 调用,并在 Android 环境中执行相应的操作。总结起来,
config.xml
中的这个<feature>
定义告诉 Cordova,S
这个插件特性在 Android 上由com.customer.plugins.a.A
这个类来实现。然后,在你的 Java 代码中,你需要确保A
类提供了正确的实现,以便能够响应 JavaScript 端的调用。 -
-
-
4.
分析jsp页面一个汉字章用代码实现或嵌入图片的优劣:
1. 在JSP页面用代码写个“x”
这种方式通常意味着直接在JSP文件中使用文本或CSS来显示“x”字样。这种方法的好处是简单直接,不需要额外的图片资源,加载速度快。同时,文本的样式和位置可以通过CSS灵活调整。
然而,如果“x”章需要具有特定的视觉效果(如印章样式、颜色、字体等),仅使用文本可能无法满足设计要求。此外,如果将来需要更改“x”章的样式,可能需要修改JSP文件或CSS样式表。
2. 在JSP里嵌入一个“x”章的图片
这种方式意味着将“x”章预先制作成一个图片文件,并在JSP文件中通过
<img>
标签引用该图片。这种方法可以确保“x”章具有精确的视觉效果,与实际打印出来的效果一致。然而,使用图片会增加页面的加载时间,特别是当图片文件较大或网络状况不佳时。此外,如果将来需要更改“已执行”章的样式,需要更新图片文件并重新上传到服务器。
综合考虑:
-
•
如果“x”章的样式简单且不需要频繁更改,使用文本方式可能更为方便和高效。
-
•
如果“x”章需要具有特定的视觉效果且样式稳定,使用图片方式可能更为合适。
-
springmvc框架。在jsp页面加载出ftp上的多张电子签名JPEG图片,分析:
1. 直接提供FTP上的图片URL
如果FTP服务器支持HTTP访问,并且您的应用有权限访问这些图片,那么可以直接在JSP页面中通过<img>
标签的src
属性引用这些图片的URL。
html复制代码<img src="ftp://your-ftp-server/path/to/signature1.jpg" alt="Signature 1"> <img src="ftp://your-ftp-server/path/to/signature2.jpg" alt="Signature 2"> <!-- 更多图片 -->
但是,请注意,直接使用FTP URL可能受到浏览器支持的限制,以及FTP服务器配置的影响。如果FTP不支持直接HTTP访问,则需要考虑其他方法。
2. 后端作为代理下载图片并提供HTTP访问
如果FTP服务器不支持HTTP访问,或者出于安全原因您不希望直接在前端暴露FTP服务器的细节,您可以在后端编写一个服务来作为代理,从FTP下载图片并提供给前端通过HTTP访问。
Spring MVC中,您可以创建一个Controller来处理图片请求,并在其中从FTP下载图片并作为响应返回。
java复制代码@Controller public class ImageController { @GetMapping("/images/{filename:.+}") public ResponseEntity<byte[]> getImageFromFtp(@PathVariable String filename) { // 从FTP下载图片的逻辑 byte[] imageBytes = ftpService.downloadImage(filename); // 设置响应头,指定内容类型为图片格式(例如image/jpeg) HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_JPEG); return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK); } }
然后在JSP页面中,您可以像下面这样引用图片:
html复制代码<img src="${pageContext.request.contextPath}/images/signature1.jpg" alt="Signature 1"> <img src="${pageContext.request.contextPath}/images/signature2.jpg" alt="Signature 2"> <!-- 更多图片 -->
3. 使用Base64编码(不推荐,除非有特殊需求)
虽然您提到了使用Base64编码,但这种方法通常不推荐用于大量或大尺寸的图片,因为它会显著增加传输的数据量,并可能导致性能问题。但如果图片非常小,或者您有特殊的传输需求,可以考虑这种方法。在后端将图片转换为Base64编码的字符串,然后将其作为数据属性嵌入到JSP页面的JavaScript中,再通过JavaScript将Base64字符串转换为图片并显示。
请注意,对于大型应用或高性能要求的应用,通常建议避免在前端传输大量的Base64编码数据。
2024-04-12,
2024-04-12,
-
1.
目前项目中有这样的结构:app/src/main/cordovasource,下面有cordova-js-src文件夹、plugins文件夹,还有config.json、cordova.js、cordova_plugins.js,其中plugins文件夹下有例如/sys-cordova-plugin-a/S.js,cordova_plugins.js里有如下定义,请问怎样理解我上面说的这些结构和文件及内容:
{ "file": "plugins/sys-cordova-plugin-a/S.js", "id": "sys-cordova-plugin-a.S", "pluginId": "sys-cordova-plugin-a", "clobbers": [ "window.S" ] },
你提到的项目结构和文件内容是与 Apache Cordova 相关的。Apache Cordova 是一个开源的移动应用开发框架,它允许你使用标准的 Web 技术(HTML5, CSS3, 和 JavaScript)来构建跨平台的应用程序,并可以访问设备的原生功能。
下面是你提到的结构和文件的解释:
结构和文件
-
1.
app/src/main/cordovasource
-
•
这是一个目录,用于存放 Cordova 相关的源代码和插件。
-
-
2.
cordova-js-src
-
•
这个文件夹可能包含 Cordova 的 JavaScript 源代码。
-
-
3.
plugins
-
•
这个文件夹包含项目的所有 Cordova 插件。每个插件都是一个子目录,包含该插件的源代码和其他资源。
-
-
4.
config.json
-
•
这个文件可能包含项目的配置信息,例如插件列表、平台设置等。
-
-
5.
cordova.js
-
•
这是 Cordova 的核心 JavaScript 文件,它提供了与原生代码的桥接功能,使得 JavaScript 代码可以调用原生功能。
-
-
6.
cordova_plugins.js
-
•
这个文件定义了项目中使用的所有 Cordova 插件的信息。它告诉 Cordova 如何加载和使用这些插件。
-
cordova_plugins.js
的内容
你提供的 cordova_plugins.js
中的内容定义了一个 Cordova 插件的信息:
-
•
file
: 指定插件的 JavaScript 文件的位置。在这个例子中,插件的 JavaScript 文件是plugins/sys-cordova-plugin-appupdat/S.js
。 -
•
id
: 插件的唯一标识符。这个标识符通常用于在 JavaScript 中引用插件。 -
•
pluginId
: 插件的 ID,通常与插件的目录名相同。 -
•
clobbers
: 这是一个数组,指定了插件将覆盖或扩展的全局对象。在这个例子中,S
插件将覆盖或扩展window.S
对象。这意味着在 JavaScript 中,你可以通过window.S
来访问和使用这个插件的功能。
总结
你提到的结构和文件是 Cordova 项目中常见的组成部分。它们共同协作,使得你可以使用 JavaScript 来调用设备的原生功能,并通过插件来扩展你的应用的功能。通过查看 cordova_plugins.js
文件,你可以了解项目中使用了哪些插件,以及这些插件如何与 JavaScript 代码进行交互。
2024-04-13,
-
1.
webSQL和indexedDB的关系是什么?
-
1.
都是浏览器提供的本地数据库存储,webSQL因安全问题等已被废弃,目前使用indexedDB。
-
后端启动报错:java: 找不到符号 符号: 方法 setA(java.lang.String)
项目已导入lombok且实体加了@Data注解。maven进行clean、install后,对idea清除缓存,然后rebuild项目还是报错。正在排查原因
2024-04-14,
如何理解js代码:window.resolveLocalFileSystemURL
-
1.
window.resolveLocalFileSystemURL是一个Web API,允许网页通过js访问操作用户的本地文件系统。
基本功能是根据提供的URL解析出对应的本地文件系统条目,然后用于进一步的读取写入等文件操作。
2024-04-17,
/* 查出t表中子级数量大于1的(层级)记录的id及子级数量 */ /* 备注:t表通过fcc父层级 字段来指向其父级记录的id */ select t.fcc, count(t.id) childNum from t group by t.fcc having count(t.id) > 1; /*start with connect by prior 遍历查找出所有祖先(或子孙) 具体查祖先还是子孙,取决于prior后等号前是哪个字段*/ /* t.id可以理解为父行的字段,所以如下sql查的是id为01015这一级,以及其所有子孙 */ select t.* from t start with t.id = '8A03DF0E-8383-46D5-9AA0-6B7DAE5B29A4-01015' connect by prior t.id = t.fcc; /* t.fcc可以理解为子行的字段,所以如下sql查的是id为01015这一级,以及其所有祖先 */ select t.* from t start with t.id = '8A03DF0E-8383-46D5-9AA0-6B7DAE5B29A4-01015' connect by prior t.fcc = t.id;
2024-04-18,
-
1.
行转列,列转行
/* 行转列 */
SELECT R.`STU_NAME`,
MAX(CASE
WHEN R.`COURSE_NAME`='数学' THEN R.`SCORE`
ELSE NULL
END) 数学,
MAX(CASE
WHEN R.`COURSE_NAME`='英语' THEN R.`SCORE`
ELSE NULL
END) 英语
FROM TABLE_ROW R
GROUP BY R.`STU_NAME`;
/* 列转行 */
SELECT T1.`STU_NAME`, '数学' COURSE_NAME, T1.`MATH_SCORE` SCORE FROM TABLE_COLUMN T1
UNION ALL
SELECT T2.`STU_NAME`, '英语' COUSE_NAME, T2.`ENGLISH_SCORE` SCORE FROM TABLE_COLUMN T2;
-
1.
sql里union、union all区别:union all包含去重操作,所以如果确定不含重复的无需去重,则用union all(因为其更快)
// 设置对话框的z-index(堆叠顺序)
$.dialog.setting.zIndex = getzIndex(true);
// 对str进行编码,以避免str中可能包含的特殊字符(例如空格、特殊符号)在URL中有特殊含义导致解析报错
let strPenName = encodeURIComponent(strPenNameBeforeCode);
2024-04-20,
-
1.
springmvc url中携带参数,后端获取:推荐@RequestParam("strPenName") String strPenName这种方式来获取,或者采用request.getParameter("strPenName")来获取,这两种方式均测试通过。
-
1.
若接口Controller层是@Controller注解,那么接口方法上要加上注解@ResponseBody来标识:已测试通过。
-
1.
原理:将方法返回的对象直接写入http响应体中,通常用于返回JSON或XML等格式的响应数据给前端。
-
2.
区别于返回视图,避免spring MVC去解析视图名称。
-
-
2.
但当直接在Controller层使用@RestController时,仍报错,正在排查
-
1.
扔报错:org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'penRestController' must be of type [org.springframework.web.servlet.View], but was actually of type [PenRestController]
-
-
let strPenName = encodeURIComponent("Wal-Mart");
// 已测试通过
let url = "penController.do?getPenNum&strPenName="+strPenName;
// 报错,正在排查
let url2 = "penRestController.do?getPenColor&strPenName="+strPenName;
// 已测试通过
@Controller
@RequestMapping("/penController")
public class PenController extends BaseController {
@RequestMapping(params = "getPenNum")
@ResponseBody
public AjaxJson getPenNum(@RequestParam("strPenName") String strPenName) {
AjaxJson j = new AjaxJson();
j.setSuccess(true);
j.setMsg(strPenName);
return j;
}
@RequestMapping(params = "getPenColor")
@ResponseBody
public AjaxJson getPenColor(HttpServletRequest request) {
AjaxJson j = new AjaxJson();
String strPenName = request.getParameter("strPenName");
j.setSuccess(true);
j.setMsg(strPenName);
return j;
}
}
// 测试仍报错,正在排查
@RestController
@RequestMapping("/penRestController")
public class PenRestController extends BaseController {
@RequestMapping(params = "getPenColor")
public AjaxJson getPenColor(HttpServletRequest request) {
AjaxJson j = new AjaxJson();
String strPenName = request.getParameter("strPenName");
j.setSuccess(true);
j.setMsg(strPenName);
return j;
}
}
2024-04-21,
- 梳理老项目功能,h服务启动报错“找不到get/set方法”,同时另一a服务报错如下:
java: You aren't using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy25 Lombok supports: sun/apple javac 1.6, ECJ
但l服务能正常启动(因为在其pom中单独引入了lombok),分析pom差异,将上述所有服务的父服务pom(项目总pom)中lombok由1.18.8提高到1.18.28,问题解决。
2024-04-24,
1.学习:弄个红色的“已执行”。外部样式表 未生效 暂未找到原因,先用内部样式表来实现
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>已执行标签示例</title> <!-- 外部样式表 未生效 暂未找到原因,先用内部样式表来实现 --> <!-- <link rel="stylesheet" href="executedStyles.css"> --> <style> .executed-label { /* inline内联, 且block块级 */ /* inline-block使得元素可设置内padding外margin边距及边框border */ display: inline-block; /* 外边距 */ /* margin: 50px 100px; */ padding: 5px 10px; /* 边框 2px,实线,红色 */ border: 2px solid red; /* 3个颜色都取0,最终就是黑色 */ color: #000; /* 背景色,3个颜色都取f最大值,最终就是白色 */ background-color: #fff; /* 圆角边框 半径 */ border-radius: 5px; /* 字体 bold:加粗;normal:常规 */ font-weight: bold; } </style> </head> <body> <div class="executed-label">已执行</div> </body> </html>
2024-04-25,
1.js对对象过滤出包含某个字符串的所有属性对应的值(数组)
const multipleFile = { file1: 'content1', file2: 'content2', file3: 'content3', otherFile: 'otherContent' }; const result = Object.keys(multipleFile).filter(key => key.includes('file')).map(key => multipleFile[key]); console.log('最终结果:' + result); // 输出:最终结果:content1,content2,content3 // Object.keys获取对象的所有key(结果为一个数组) multipleFile.undefinedKey = undefined; const keyArray = Object.keys(multipleFile); console.log('Object.keys获取对象的所有key(结果为一个数组)' + keyArray); // 输出:Object.keys获取对象的所有key(结果为一个数组)file1,file2,file3,otherFile,undefinedKey // filter:过滤,对数组过滤出满足函数的每个元素 // includes:判断字符串是否包含某个子串 const subStr = 'file'; const satisfyFunctionArray = keyArray.filter(key => key.includes(subStr)); console.log('filter:对数组过滤出满足函数的每个元素:' + satisfyFunctionArray); // 输出:filter:对数组过滤出满足函数的每个元素:file1,file2,file3 // map:返回数组中满足某个条件的所有元素组成的数组 const valueArray = satisfyFunctionArray.map(key => multipleFile[key]); console.log('map:返回数组中满足某个条件的所有元素组成的数组' + valueArray); // 输出:map:返回数组中满足某个条件的所有元素组成的数组content1,content2,content3
2.JSP里JSTL的<c:if>控制是否显示
<!-- 需用taglib指令来引入JSTL核心库,否则<c:if>无法生效 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <body> <!-- <c:if> JSTL标签 控制是否显示,是JSP中的一个条件标签 --> <!-- test后面一定要接一个el表达式(expression language),假设isShowRgk是布尔值 --> <!-- test后必须是el表达式,(el表达式在JSP页面中必须用${}括起来),而不允许直接跟变量(即使是布尔值也不行)--> <c:if test="${ isShowRgk}"> <div>test="true"可以显示</div> </c:if> <c:if test="${ !isShowRgk}"> <div>test="false"不会显示</div> </c:if> </body>
3.js过滤数组
const originalArray = [{ id: 'a', name: '张三' },{ id: 'b', name: '李四' }]; // 过滤id='b'的 const filterArray = originalArray.filter(key => { return key.id === 'b'; }); console.log(filterArray);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步