在js中數組相關用法講解

數組

uniqueArray

簡單數組去重

/*** 簡單數組去重* @param arr* @returns*/
export const uniqueArray = <T>(arr: T[]) => [...new Set(arr)];const arr1 = [1,1,1,1 2, 3];uniqueArray(arr); // [1,2,3]

uniqueArrayByKey

根據 key 數組去重

/*** 根據key數組去重* @param arr* @param key* @returns*/
export function uniqeArrayByKey(arr: any[], key: string) {const obj: Record<string, any> = {}return arr.reduce((prev, item) => {obj[item[key]] ? '' : (obj[item[key]] = true && prev.push(item))return prev}, [])
}const arr = [{ id: 1, parentid: 0 },{ id: 2, parentid: 1 },{ id: 3, parentid: 1 },{ id: 3, parentid: 1 },
]uniqeArrayByKey(arr, 'id')/*** [{ id: 1, parentid: 0 },{ id: 2, parentid: 1 },{ id: 3, parentid: 1 },
];**/

sortCompare

數組根據 key 排序

/*** 排序* arr: 所需排序的數組* prop:排序的依據字段* order:默認true -> 正序(小 -> 大) / false -> 倒序(大 -> 小)*/
export const sortCompare = (arr: any[], prop: string | number, order = true) => {return arr.sort(compare(prop, order))
}function compare(prop: string | number, order: boolean) {return (obj1: Record<string, any>, obj2: Record<string, any>) => {let val1 = obj1[prop]let val2 = obj2[prop]if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {val1 = Number(val1)val2 = Number(val2)}if (order) {if (val1 < val2) return -1else if (val1 > val2) return 1else return 0} else {if (val1 > val2) return -1else if (val1 < val2) return 1else return 0}}
}const arr = [{ order: 1, name: '1' },{ order: 10, name: '10' },{ order: 3, name: '3' },
]const sortArr = sortCompare(arr, order)/*** [{ order: 1, name: '1' },{ order: 3, name: '3' },{ order: 10, name: '10' },
];**/

multiFieldSort

數組根據多個字段排序

/*** multiFieldSort(data, [{ field: 'age', order: 'desc' }, { field: 'name' }, { field: 'salary', order: 'desc' }])* @param {*} arr* @param {*} sortFields* @returns*/
export function multiFieldSort(arr, sortFields) {return arr.sort((a, b) => {for (let i = 0; i < sortFields.length; i++) {let field = sortFields[i].fieldlet order = sortFields[i].order || 'asc'if (a[field] < b[field]) {return order === 'asc' ? -1 : 1}if (a[field] > b[field]) {return order === 'asc' ? 1 : -1}}return 0})
}

getArrayLabelByValue

根據數組和 value 獲取數組中的 label,沒有返回 undefined

interface IParams {arr: any[]value: anyvalueKey?: stringlabelKey?: stringdefaultValue?: string | number
}/*** 根據數組獲取數組中的值* @param param* @returns*/
export function getArrayLabelByValue({arr,value,valueKey = 'value',labelKey = 'label',defaultValue = undefined,
}: IParams) {if (!Array.isArray(arr)) {throw new Error('Type requires an array')}const obj = arr.find(item => String(item[valueKey]) === String(value))return obj ? obj[labelKey] : defaultValue
}/*** {arr,value,valueKey = 'value',labelKey = 'label',defaultValue = undefined,
}*/const arr = [{label: 'Tom',value: '1',},{label: 'Lily',value: '2',},
]getArrayLabelByValue({ arr, value: '2' }) // Lily

shuffle

洗牌算法隨機

/*** 洗牌算法隨機* @param arr* @returns*/
export function shuffle(arr: any[]) {let result: any[] = [],random: numberwhile (arr.length > 0) {random = Math.floor(Math.random() * arr.length)result.push(arr[random])arr.splice(random, 1)}return result
}const arr = [1, 2, 3]shuffle(arr) // [2,3,1]

compact

去除數組中的無效/無用值

/*** 去除數組中的無效/無用值* @param arr* @returns*/
export function compact(arr: any[]) {return arr.filter(Boolean)
}compact([0, 1, false, 2, '', 3, 'a', 'e' * 23, NaN, 's', 34])// [ 1, 2, 3, 'a', 's', 34 ]

countOccurrences

檢測數值出現次數

/*** 檢測數值出現次數* @param arr* @param val* @returns*/
export function countOccurrences(arr: any[], val: any) {return arr.reduce((a, v) => (v === val ? a + 1 : a), 0)
}countOccurrences([1, 1, 2, 1, 2, 3], 1) // 3

flatten

指定深度扁平化數組

/*** 指定深度扁平化數組* @param arr* @param depth* @returns*/
export function flatten(arr: any[], depth = 1): any[] {return arr.reduce((a, v) => a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v), [])
}flatten([1, [2], 3, 4]) // [1, 2, 3, 4]
flatten([1, [2, [3, [4, 5], 6], 7], 8], 2) // [1, 2, 3, [4, 5], 6, 7, 8]

deepFlatten

遞歸扁平化數組

/*** 遞歸扁平化數組* @param arr* @returns*/
export function deepFlatten(arr: any[]): any[] {return [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)))
}deepFlatten([1, [2], [[3], 4], 5]) // [1,2,3,4,5]

difference

查找兩個數組之間的差異

/*** 查找兩個數組之間的差異* @param a* @param b* @returns*/
export const difference = (a: any[], b: any[]) => {const s = new Set(b)return a.filter(x => !s.has(x))
}difference([1, 2, 3], [1, 2, 4]) // [3]

indexOfAll

返回數組中某值的所有索引

/*** 返回數組中某值的所有索引* @param arr* @param val* @returns*/
export const indexOfAll = (arr: any[], val: any) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), [])indexOfAll([1, 2, 3, 1, 2, 3], 1) // [0,3]
indexOfAll([1, 2, 3], 4) // []

intersection

兩數組的交集

/*** 兩數組的交集* @param a* @param b* @returns*/
export const intersection = (a: any[], b: any[]) => {const s = new Set(b)return a.filter(x => s.has(x))
}intersection([1, 2, 3], [4, 3, 2]) // [2, 3]

intersectionBy

兩數組都符合條件的交集

可用于在對兩個數組的每個元素執行了函數之后,返回兩個數組中存在的元素列表。

/*** 兩數組都符合條件的交集* @param a* @param b* @param fn* @returns*/
export const intersectionBy = (a: any[], b: any[], fn: (arg0: any) => unknown) => {const s = new Set(b.map(fn))return a.filter(x => s.has(fn(x)))
}intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor) // [2.1]

intersectionWith

先比較后返回交集

/*** 先比較后返回交集* @param a* @param b* @param comp* @returns*/
export const intersectionWith = (a: any[], b: any[], comp: (arg0: any, arg1: any) => any) =>a.filter(x => b.findIndex(y => comp(x, y)) !== -1)intersectionWith([1, 1.2, 1.5, 3, 0], [1.9, 3, 0, 3.9], (a, b) => Math.round(a) === Math.round(b)) // [1.5, 3, 0]

addDeepProperty

給樹結構每一層添加一層 deep 用以區分

export function addDeepProperty(tree, deep = 1) {// 添加屬性 deep 到當前層級tree.deep = deep// 遞歸處理子節點if (tree.children && tree.children.length > 0) {tree.children.forEach(child => {addDeepProperty(child, deep + 1)})}return tree
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900351.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RT-Thread ulog 日志組件深度分析

一、ulog 組件核心功能解析 輕量化與實時性 ? 資源占用&#xff1a;ulog 核心代碼僅需 ROM<1KB&#xff0c;RAM<0.2KB&#xff0c;支持在資源受限的MCU&#xff08;如STM32F103&#xff09;中運行。 ? 異步/同步模式&#xff1a;默認采用異步環形緩沖區&#xff08;rt_…

T113s3遠程部署Qt應用(dropbear)

T113-S3 是一款先進的應用處理器&#xff0c;專為汽車和工業控制市場而設計。 它集成了雙核CortexTM-A7 CPU和單核HiFi4 DSP&#xff0c;提供高效的計算能力。 T113-S3 支持 H.265、H.264、MPEG-1/2/4、JPEG、VC1 等全格式解碼。 獨立的硬件編碼器可以編碼為 JPEG 或 MJPEG。 集…

12.青龍面板自動化我的生活

安裝 docker方式 docker run -dit \ -v /root/ql:/ql/data \ -p 5700:5700 \ -e ENABLE_HANGUPtrue \ -e ENABLE_WEB_PANELtrue \ --name qinglong \ --hostname qinglong \ --restart always \ whyour/qinglongk8s方式 https://truecharts.org/charts/stable/qinglong/ he…

Maven 遠程倉庫推送方法

步驟 1&#xff1a;配置 pom.xml 中的遠程倉庫地址 在項目的 pom.xml 文件中添加 distributionManagement 配置&#xff0c;指定遠程倉庫的 URL。 xml 復制 <project>...<distributionManagement><!-- 快照版本倉庫 --><snapshotRepository><id…

Spring Boot 日志 配置 SLF4J 和 Logback

文章目錄 一、前言二、案例一&#xff1a;初識日志三、案例二&#xff1a;使用Lombok輸出日志四、案例三&#xff1a;配置Logback 一、前言 在開發 Java 應用時&#xff0c;日志記錄是不可或缺的一部分。日志可以記錄應用的運行狀態、錯誤信息和調試信息&#xff0c;幫助開發者…

JS API 事件監聽

焦點事件案例&#xff1a;搜索框激活下拉菜單 事件對象 事件對象存儲事件觸發時的相關信息 可以判斷用戶按鍵&#xff0c;點擊元素等內容 如何獲取 事件綁定的回調函數中的第一個形參就是事件對象 一般命名為e,event 事件對象常用屬性 type類型 click mouseenter client…

DDD與MVC擴展能力對比

一、架構設計理念的差異二、擴展性差異的具體表現三、DDD擴展性優勢的深層原因四、MVC擴展性不足的典型場景五、總結&#xff1a;架構的本質與選擇六、例子1&#xff09;場景描述2&#xff09;MVC實現示例&#xff08;三層架構&#xff09;3&#xff09;DDD實現示例&#xff08…

針對 SQL 查詢中 IN 子句性能優化 以及 等值 JOIN 和不等值 JOIN 對比 的詳細解決方案、代碼示例及表格總結

以下是針對 SQL 查詢中 IN 子句性能優化 以及 等值 JOIN 和不等值 JOIN 對比 的詳細解決方案、代碼示例及表格總結&#xff1a; 問題 1&#xff1a;IN 的候選值過多&#xff08;如超過 1000 個&#xff09; 問題描述 當 IN 列表中的值過多時&#xff0c;SQL 會逐個比較每個值…

手部穴位檢測技術:基于OpenCV和MediaPipe的實現

手部穴位檢測是醫學和健康管理領域的重要技術之一。通過準確識別手部的關鍵穴位,可以為中醫診斷、康復治療以及健康監測提供支持。本文將介紹一種基于OpenCV和MediaPipe的手部穴位檢測方法,展示如何利用計算機視覺技術實現手部關鍵點的檢測,并進一步標注手部的穴位位置。 技…

Day20 -自動化信息收集工具--ARL燈塔的部署

準備&#xff1a; 純凈的Docker環境 ARL的包 一、Docker的部署 00x1 更新系統包 sudo apt update 00x2 安裝必要的依賴包 sudo apt install -y apt-transport-https ca-certificates curl software-properties-common 00x3 下載docker和docker-compose apt-get install do…

sqlalchemy查詢json

第一種&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…

搭建K8S-1.23

0、簡介 這里只用3臺服務器來做一個簡單的集群 地址主機名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 1、關閉三個服務 &#xff08;1&#xff09;防火墻 systemctl stop firewalld &#xff08;2&#xff09;Selinux setenf…

初階數據結構--樹

1. 樹的概念與結構 樹是?種?線性的數據結構&#xff0c;它是由 n&#xff08;n>0&#xff09; 個有限結點組成?個具有層次關系的集合。把它叫做 樹是因為它看起來像?棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;?葉朝下的。 有?個特殊的結點&#xff0c;稱…

硬件工程師面試問題(五):藍牙面試問題與詳解

藍牙技術作為物聯網與智能設備的核心無線協議&#xff0c;其硬件設計能力直接影響產品連接穩定性、功耗及兼容性。面試是評估候選人射頻電路設計、天線優化、協議棧調試等綜合技能的關鍵環節&#xff0c;尤其在BLE低功耗設計、共存抗干擾等場景中&#xff0c;硬件工程師的實踐經…

Redis-基本數據類型

Redis支持的基本數據類型&#xff1a;String、hash、list、Set、Zset 一、String 特點 可以存儲三種類型 int、float、string 運用場景 緩存&#xff1a;存儲HTML片段、用戶會話&#xff08;Session&#xff09;計數器&#xff1a;網站訪問量、點贊數&#xff08;incr方法&am…

Tomcat的部署

Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和 并發訪問用戶不是很多的場合下被普遍使用&#xff0c;Tomcat 具有處理HTML頁面的功能&#xff0c;它還是一個Servlet和 JSP容器 官網:Apache Tomcat - Welco…

Linux的TCP連接數到達2萬,其中tcp_tw、tcp_alloc、tcp_inuse都很高,可能出現什么問題

當 Linux 系統的 TCP 連接數達到 2 萬,且 /proc/net/sockstat 中的 tcp_tw(TIME_WAIT 連接)、tcp_alloc(已分配但未完全建立的連接)和 tcp_inuse(正在使用的連接)均處于高位時,可能會引發以下問題: 一、關鍵指標分析 通過 /proc/net/sockstat 可以查看 TCP 連接狀態:…

服務器數據恢復—Raid6陣列硬盤故障掉線,上層虛擬機數據如何恢復?

服務器數據恢復環境&故障&#xff1a; 一臺由16塊硬盤組成的raid6磁盤陣列。磁盤陣列中有一塊硬盤因為物理故障掉線&#xff0c;導致服務器上層虛擬機無法正常使用&#xff0c;部分分區丟失&#xff0c;重啟物理服務器后發現數據丟失。 服務器數據恢復過程&#xff1a; 1、…

Unhandled exception: org.apache.poi.openxml4j.exceptions.InvalidFormatException

代碼在main方法里面沒有報錯&#xff0c;在Controller里面就報錯了。 原來Controller類里面少了行代碼 import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 加上去就解決了。

RISC-V debug專欄2 --- Debug Module(DM)

Debug Module&#xff08;DM&#xff09;的核心功能 DM 就像一個翻譯官&#xff0c;負責把調試器的抽象指令&#xff08;比如 “暫停處理器”&#xff09;轉換成硬件能聽懂的具體操作。它必須實現以下基本功能&#xff1a; 必要功能&#xff08;必須實現&#xff09;&#xff…