最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript列表獲取指定范圍值的N種方法

 更新時間:2026年05月25日 08:26:24   作者:detayun  
在日常開發(fā)中,我們經(jīng)常需要從數(shù)組中提取指定范圍的值,本文為大家總結(jié)了一下?JS?中獲取數(shù)組指定范圍值的所有方法,文中的示例代碼講解詳細,有需要的小伙伴可以了解下

前言

在日常開發(fā)中,我們經(jīng)常需要從數(shù)組中提取指定范圍的值。比如獲取最近7天的數(shù)據(jù)、提取表格中D列到F列的內(nèi)容、截取數(shù)組中間一段做分析等等。

看似簡單的需求,其實有 N 種實現(xiàn)方式!今天就來總結(jié)一下 JS 中獲取數(shù)組指定范圍值的所有方法,從最老的語法到最新的 ES2023 特性,一網(wǎng)打盡!??

方法一覽

序號方法是否修改原數(shù)組兼容性推薦度代碼量
1slice(start, end) ?? 不修改? IE9+?????1行
2splice(start, count)? 修改? IE4+???1行
3for + if 手動截取? 不修改? IE6+????5行
4filter() + 索引? 不修改? ES5+???1行
5reduce() 累積? 不修改? ES5+??2行
6at() + 循環(huán)(ES2022)? 不修改? ES2022+????1行

方法詳解

方法1:slice(start, end)????? 最推薦

這是 最常用、最簡潔 的方法,左閉右開,不會修改原數(shù)組!

const list = [10, 20, 30, 40, 50, 60, 70];

// ? 提取索引 2 到 5(不包含5)
const sub1 = list.slice(2, 5);
console.log(sub1); // [30, 40, 50]

// ? 提取索引 3 到末尾
const sub2 = list.slice(3);
console.log(sub2); // [40, 50, 60, 70]

// ? 使用負數(shù)索引(從末尾開始)
const sub3 = list.slice(-4, -1);
console.log(sub3); // [40, 50, 60]

// ? 提取最后一個元素(等同于 at(-1))
const sub4 = list.slice(-1);
console.log(sub4[0]); // 70

關(guān)鍵規(guī)則

規(guī)則說明示例
slice(start, end)左閉右開,包含 start,不包含 endslice(2,5) → 索引 2,3,4
slice(start)從 start 到末尾slice(3) → 索引 3,4,5…
slice(-3)倒數(shù)第3個到末尾slice(-3) → 最后3個
slice(-4,-1)倒數(shù)第4個到倒數(shù)第1個(不含)→ 倒數(shù)第4,3,2個
start >= end返回空數(shù)組slice(5,2)[]

底層原理slice() 是淺拷貝,對于嵌套數(shù)組/對象,內(nèi)部引用仍指向原數(shù)據(jù)。

方法2:splice(start, count)??? 會修改原數(shù)組!

splice()刪除并返回指定范圍的元素,原數(shù)組會被修改

const list = [10, 20, 30, 40, 50];

// ? 從索引1開始,刪除3個元素
const removed = list.splice(1, 3);
console.log(removed); // [20, 30, 40]
console.log(list);    // [10, 50]  ?? 原數(shù)組被改了!

適用場景:需要同時刪除并獲取元素時使用。

方法用途是否修改原數(shù)組
slice(start, end)提取范圍(只讀)? 不修改
splice(start, count)刪除范圍(可寫)? 修改

方法3:for+if手動截取 ???? 兼容老瀏覽器

如果需要復雜條件判斷(比如排除空行),用手動循環(huán)最靈活!

const list = [10, 20, 30, 40, 50, 60, 70];
const result = [];

// ? 提取索引 2 到 5 的元素
for (let i = 2; i < 5; i++) {
  result.push(list[i]);
}
console.log(result); // [30, 40, 50]

// ? 提取索引 3 到末尾
for (let i = 3; i < list.length; i++) {
  result.push(list[i]);
}
console.log(result); // [40, 50, 60, 70]

實戰(zhàn)案例:排除空行數(shù)據(jù)(JS宏場景)

// 讀取表格數(shù)據(jù),排除空行
function getTableData(sheetData) {
  let results = [];
  // 從第1行開始(跳過表頭)
  for (let i = 1; i < sheetData.length; i++) {
    let rowData = sheetData[i].slice(0, 3); // 提取前3列
    // 正則判斷是否全是空白字符
    if (!/^[\s]*$/.test(rowData.join(''))) {
      results.push(rowData);
    }
  }
  return results.length > 0 ? results : "";
}

正則 /^[\s]*$/ 解析:^ 開頭,[\s]* 零個或多個空白字符,$ 結(jié)尾 → 整行都是空白

方法4:filter()+ 索引判斷 ??? 函數(shù)式風格

const list = [10, 20, 30, 40, 50, 60, 70];

// ? 提取索引 2 到 5 的元素
const sub = list.filter((_, index) => index >= 2 && index < 5);
console.log(sub); // [30, 40, 50]

// ? 提取倒數(shù)3個元素
const last3 = list.filter((_, index) => index >= list.length - 3);
console.log(last3); // [50, 60, 70]

優(yōu)點:代碼簡潔,函數(shù)式風格

缺點:性能略差(需要遍歷整個數(shù)組)

方法5:reduce()累積 ?? 函數(shù)式編程

const list = [10, 20, 30, 40, 50, 60, 70];

// ? 提取索引 2 到 5 的元素
const sub = list.reduce((acc, cur, i) => {
  if (i >= 2 && i < 5) acc.push(cur);
  return acc;
}, []);
console.log(sub); // [30, 40, 50]

優(yōu)點:函數(shù)式編程,適合鏈式調(diào)用

缺點:代碼復雜,性能一般

方法6:at()+ 循環(huán)(ES2022)???? 語義最清晰

ES2022 新增的 at() 支持負數(shù)索引,語義最清晰!

const list = [10, 20, 30, 40, 50, 60, 70];

// ? 提取最后3個元素
const last3 = [list.at(-3), list.at(-2), list.at(-1)];
console.log(last3); // [50, 60, 70]

// ? 通用函數(shù):提取任意范圍
function getRange(arr, start, end) {
  const result = [];
  for (let i = start; i < end; i++) {
    result.push(arr.at(i));
  }
  return result;
}
console.log(getRange(list, 2, 5)); // [30, 40, 50]
方法正序索引逆序索引示例
arr[i]? arr[0]? 不支持arr[0] → 10
arr.at(i)? arr.at(0)? arr.at(-1)arr.at(-1) → 70

性能對比(100萬次循環(huán))

方法耗時性能排名推薦度
slice(start, end)~15ms?? 第1名?????
for + push~18ms?? 第2名????
at() + 循環(huán)~20ms?? 第3名????
filter()~80ms第4名???
reduce()~120ms第5名??
splice()~25ms第6名(但會修改)???

結(jié)論slice() 性能最好,for 循環(huán)緊隨其后,函數(shù)式方法稍慢但代碼優(yōu)雅!

安全寫法(防止越界)

const list = [10, 20, 30];

// ? 不安全:end 超出范圍會返回到末尾,但 start 超出會返回空數(shù)組
const sub1 = list.slice(5, 10); // []

// ? 安全寫法:限制范圍
function safeSlice(arr, start, end) {
  start = Math.max(0, start);
  end = Math.min(arr.length, end);
  return arr.slice(start, end);
}

console.log(safeSlice(list, 1, 10)); // [20, 30]

實戰(zhàn)場景

場景1:獲取最近7天數(shù)據(jù)

const prices = [10.5, 20.3, 15.8, 12.1, 18.9, 22.5, 19.8, 25.3, 28.7, 30.2];

// ? 提取最近7天
const last7 = prices.slice(-7);
console.log(last7); // [18.9, 22.5, 19.8, 25.3, 28.7, 30.2]

場景2:提取表格指定列(JS宏)

// 提取 D列 到 F列(索引3到6,左閉右開)
const fangwei = [3, 6];
const colData = sheetData[i].slice(fangwei[0], fangwei[1]);
// D列索引=3, F列索引=5, slice(3,6) → 索引3,4,5 → D,E,F列

場景3:排除空行后提取范圍

const rawData = [
  [10, 20, 30],
  [],           // 空行
  [40, 50, 60],
  null,         // 空行
  [70, 80, 90]
];

const filtered = rawData.filter(row => row && row.length > 0);
const result = filtered.slice(1, 3); // 提取第2到第3行
console.log(result); // [[40, 50, 60]]

封裝通用函數(shù)

/**
 * 獲取數(shù)組指定范圍的值
 * @param {Array} arr - 原數(shù)組
 * @param {Number} start - 起始索引(支持負數(shù))
 * @param {Number} end - 結(jié)束索引(不包含,支持負數(shù),可省略)
 * @returns {Array} 范圍內(nèi)的值
 */
function getRange(arr, start, end) {
  if (end === undefined) {
    return arr.slice(start); // 從 start 到末尾
  }
  return arr.slice(start, end);
}

// 使用示例
const list = [10, 20, 30, 40, 50, 60, 70];

console.log(getRange(list, 2, 5));    // [30, 40, 50]
console.log(getRange(list, -3));      // [50, 60, 70]
console.log(getRange(list, -4, -1));  // [40, 50, 60]

最終推薦

場景推薦方法代碼
? 通用場景(首選)slice(start, end)arr.slice(2, 5)
? 現(xiàn)代項目(ES2022+)at() + 循環(huán)arr.at(i)
? 兼容老瀏覽器for + push手動循環(huán)
? 需要刪除原數(shù)據(jù)splice(start, count)arr.splice(2, 3)
? 函數(shù)式風格filter()arr.filter((_,i)=>i>=2&&i<5)
? 不推薦reverse()[0]會修改原數(shù)組

總結(jié)表格(6種方法)

序號方法修改原數(shù)組兼容性性能推薦指數(shù)
1slice(start, end)?IE9+???????
2splice(start, count)?IE4+?????
3for + if?IE6+??????
4filter()?ES5+第4名???
5reduce()?ES5+第5名??
6at() + 循環(huán)?ES2022+??????

一句話總結(jié)

萬能首選slice(start, end) —— 不修改原數(shù)組、性能最優(yōu)、兼容性好!

語義最清晰at(index) —— 正負索引都支持,一看就懂!

最靈活for + if —— 復雜條件判斷的不二之選!

以上就是JavaScript列表獲取指定范圍值的N種方法的詳細內(nèi)容,更多關(guān)于JavaScript列表獲取指定范圍值的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • javascript繪制漂亮的心型線效果完整實例

    javascript繪制漂亮的心型線效果完整實例

    這篇文章主要介紹了javascript繪制漂亮的心型線效果實現(xiàn)方法,結(jié)合完整實例形式分析了JavaScript圖形繪制的具體步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2016-02-02
  • JavaScript實現(xiàn)圖片瀑布流和底部刷新

    JavaScript實現(xiàn)圖片瀑布流和底部刷新

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)圖片瀑布流和底部刷新,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • JS實現(xiàn)transform實現(xiàn)扇子效果

    JS實現(xiàn)transform實現(xiàn)扇子效果

    這篇文章主要為大家詳細介紹了JS實現(xiàn)transform實現(xiàn)扇子效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 微信小程序?qū)崿F(xiàn)雙層嵌套菜單欄

    微信小程序?qū)崿F(xiàn)雙層嵌套菜單欄

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)雙層嵌套菜單欄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • js不間斷滾動的簡單實現(xiàn)

    js不間斷滾動的簡單實現(xiàn)

    下面小編就為大家?guī)硪黄猨s不間斷滾動的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • js執(zhí)行shell命令的幾種方式(Node)

    js執(zhí)行shell命令的幾種方式(Node)

    在做一個客戶端基建項目的時候,多處需要用到JS調(diào)取命令行執(zhí)行shell腳本,本文主要介紹了js執(zhí)行shell命令的幾種方式,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 微信二次分享報錯invalid signature問題及解決方法

    微信二次分享報錯invalid signature問題及解決方法

    基于微信公眾號開發(fā)的h5頁面(使用jssdk接口),由用戶A分享給用戶B,用戶B再次分享這個頁面時,不能成功分享。這篇文章主要介紹了微信二次分享報錯invalid signature問題及解決方法,需要的朋友可以參考下
    2019-04-04
  • 如何解決java.lang.NumberFormatException: null異常

    如何解決java.lang.NumberFormatException: null異常

    這篇文章主要介紹了如何解決java.lang.NumberFormatException: null異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 使用控制臺破解百小度一個月只準改一次名字

    使用控制臺破解百小度一個月只準改一次名字

    這篇文章主要介紹了使用控制臺破解百小度一個月只準改一次名字的方法和代碼,有需要的小伙伴可以參考下。
    2015-08-08
  • Python要求每行輸出5個的示例代碼

    Python要求每行輸出5個的示例代碼

    本文從列表、字符串和數(shù)字三個方面詳細闡述了Python中要求每行輸出5個的相關(guān)內(nèi)容,并給出了相應的代碼示例,在實際開發(fā)中,我們可以根據(jù)具體的需求靈活運用這些方法,以提高程序的輸出效率和可讀性,需要的朋友可以參考下
    2020-05-05

最新評論

阿巴嘎旗| 青冈县| 湛江市| 桂林市| 贡觉县| 沿河| 禄丰县| 介休市| 韩城市| 西畴县| 佳木斯市| 曲周县| 杭锦旗| 固原市| 湟中县| 财经| 马关县| 车致| 云龙县| 宝坻区| 花莲市| 新巴尔虎右旗| 府谷县| 赤壁市| 油尖旺区| 富川| 南汇区| 长治县| 巴林左旗| 达州市| 应城市| 兴和县| 环江| 镇安县| 哈巴河县| 卫辉市| 雷山县| 长沙市| 临颍县| 安阳县| 益阳市|