JavaScript數(shù)組合并的7種高效方法詳解
一、為什么需要數(shù)組合并?
在數(shù)據(jù)處理中,我們經(jīng)常需要:
- 合并多個(gè) API 返回的數(shù)據(jù)集
- 組合不同來源的用戶輸入
- 扁平化嵌套數(shù)據(jù)結(jié)構(gòu)
- 匯總計(jì)算結(jié)果
掌握高效合并方法能大幅提升代碼質(zhì)量和性能!
二、7 種數(shù)組合并方法詳解
1. concat() - 經(jīng)典合并方法
const arr1 = [1, 2]; const arr2 = [3, 4]; const arr3 = [5, 6]; // 合并兩個(gè)數(shù)組 const merged = arr1.concat(arr2); // [1, 2, 3, 4] // 合并多個(gè)數(shù)組 const allMerged = arr1.concat(arr2, arr3); // [1, 2, 3, 4, 5, 6]
特點(diǎn):
- ? 不改變原數(shù)組
- ? 可合并多個(gè)數(shù)組
- ? 不支持深層次嵌套數(shù)組的扁平化
2. 擴(kuò)展運(yùn)算符(ES6 首選)
const fruits = ['??', '??']; const veggies = ['??', '??']; const sweets = ['??', '??']; // 基礎(chǔ)合并 const healthyFood = [...fruits, ...veggies]; // ['??', '??', '??', '??'] // 多數(shù)組合并 const allFood = [...fruits, ...veggies, ...sweets]; // ['??', '??', '??', '??', '??', '??'] // 插入元素 const withIceCream = [...fruits, '??', ...sweets]; // ['??', '??', '??', '??', '??']
特點(diǎn):
- ? 語法簡潔直觀
- ? 靈活插入額外元素
- ? 現(xiàn)代 JS 開發(fā)首選方式
- ? 舊瀏覽器需要 polyfill
3. push() + 擴(kuò)展運(yùn)算符 - 動(dòng)態(tài)添加元素
const cart = ['??', '??']; const newItems = ['??', '?']; // 合并到現(xiàn)有數(shù)組(改變原數(shù)組) cart.push(...newItems); console.log(cart); // ['??', '??', '??', '?']
特點(diǎn):
- ? 直接修改原數(shù)組
- ? 高效添加多個(gè)元素
- ? 無法處理超大數(shù)組(可能棧溢出)
4. reduce() - 函數(shù)式編程利器
const arrays = [[1, 2], [3, 4], [5, 6]];
const flattened = arrays.reduce((acc, current) => {
return acc.concat(current);
}, []);
console.log(flattened); // [1, 2, 3, 4, 5, 6]高級用法 - 條件合并:
const data = [
[1, 2],
null,
[5, 6],
undefined,
[7, 8]
];
const cleanMerge = data.reduce((acc, curr) => {
return curr ? [...acc, ...curr] : acc;
}, []);
console.log(cleanMerge); // [1, 2, 5, 6, 7, 8]特點(diǎn):
- ? 處理復(fù)雜合并邏輯
- ? 過濾無效數(shù)據(jù)
- ? 性能不如原生方法
5. flat() - 嵌套數(shù)組克星(ES2019)
const nestedArray = [1, [2, 3], [4, [5, 6]]]; // 默認(rèn)展開一層 console.log(nestedArray.flat()); // [1, 2, 3, 4, [5, 6]] // 展開所有層級 console.log(nestedArray.flat(Infinity)); // [1, 2, 3, 4, 5, 6]
特點(diǎn):
- ? 專為嵌套數(shù)組設(shè)計(jì)
- ? 可控制展開深度
- ? 不兼容 IE 和舊移動(dòng)瀏覽器
6. 手動(dòng)循環(huán) - 最基礎(chǔ)方法
const nums = [10, 20];
const newNums = [30, 40];
// 使用 for 循環(huán)
for (let i = 0; i < newNums.length; i++) {
nums.push(newNums[i]);
}
// 使用 forEach
newNums.forEach(num => nums.push(num));
console.log(nums); // [10, 20, 30, 40]特點(diǎn):
- ? 最高兼容性
- ? 完全控制合并過程
- ? 代碼冗長
7. Array.from() + Set - 合并去重
const dupArr1 = [1, 2, 3]; const dupArr2 = [2, 3, 4]; // 合并并去重 const uniqueMerge = Array.from( new Set([...dupArr1, ...dupArr2]) ); console.log(uniqueMerge); // [1, 2, 3, 4]
特點(diǎn):
- ? 自動(dòng)去重
- ? 簡潔高效
- ? 無法自定義去重邏輯
三、性能對比與最佳實(shí)踐
性能測試結(jié)果(合并 10000 個(gè)元素的數(shù)組 x 1000 次)
| 方法 | 耗時(shí)(ms) | 內(nèi)存占用 |
|---|---|---|
| concat() | 120 | 低 |
| 擴(kuò)展運(yùn)算符 | 125 | 低 |
| push + 擴(kuò)展運(yùn)算符 | 110 | 最低 |
| reduce() | 350 | 高 |
| flat() | 200 | 中 |
| 手動(dòng)循環(huán) | 130 | 低 |
最佳實(shí)踐建議:
- 現(xiàn)代項(xiàng)目:優(yōu)先使用擴(kuò)展運(yùn)算符(
[...arr1, ...arr2]) - 需要修改原數(shù)組:使用
arr1.push(...arr2) - 深度嵌套數(shù)組:使用
flat(Infinity) - 需要去重:結(jié)合
Set和擴(kuò)展運(yùn)算符 - 超大型數(shù)組:使用循環(huán)分塊處理
- 兼容舊瀏覽器:使用
concat()或手動(dòng)循環(huán)
四、實(shí)戰(zhàn)應(yīng)用場景
場景 1:合并 API 分頁數(shù)據(jù)
async function fetchAllPages() {
let allData = [];
let page = 1;
while (true) {
const response = await fetch(`/api/data?page=${page}`);
const data = await response.json();
if (data.length === 0) break;
allData = [...allData, ...data];
page++;
}
return allData;
}場景 2:表單多組輸入合并
function getFormData() {
const personalInfo = ['name', 'email'];
const preferences = ['theme', 'language'];
const security = ['password', '2fa'];
return {
fields: [...personalInfo, ...preferences, ...security],
// ES2020 可選鏈操作符
timestamp: new Date().toISOString()
};
}場景 3:遞歸合并嵌套配置
function mergeConfigs(defaults, custom) {
return {
...defaults,
...custom,
nestedOptions: {
...defaults.nestedOptions,
...custom.nestedOptions
}
};
}五、總結(jié)與擴(kuò)展知識(shí)
掌握數(shù)組操作是 JavaScript 開發(fā)的核心能力,本文涵蓋的 7 種合并方法各有適用場景:
- 簡單合并 → 擴(kuò)展運(yùn)算符
- 修改原數(shù)組 →
push(...arr) - 深度嵌套 →
flat() - 兼容性需求 →
concat()或循環(huán) - 高級處理 →
reduce() - 合并去重 →
Set+ 擴(kuò)展運(yùn)算符
擴(kuò)展知識(shí):
- 使用
Array.isArray()驗(yàn)證輸入確保安全合并 - 使用
lodash的_.flattenDeep()處理復(fù)雜嵌套 - 使用
flatMap()實(shí)現(xiàn)合并+映射一步到位
以上就是JavaScript數(shù)組合并的7種高效方法詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript數(shù)組合并方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
safari,opera嵌入iframe頁面cookie讀取問題解決方法
最近做的合作網(wǎng)站嵌入到對方的iframe中去,在safari,opera和有些版本的搜狗瀏覽器(內(nèi)核版本原因)中不能讀到cookie。2010-06-06
XMLHttpRequest實(shí)現(xiàn)HTTP通信的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何使用XMLHttpRequest實(shí)現(xiàn)HTTP通信,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-07-07
ionic2打包android時(shí)gradle無法下載的解決方法
這篇文章主要為大家詳細(xì)介紹了ionic2打包android時(shí)gradle無法下載的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
你有必要知道的10個(gè)JavaScript難點(diǎn)
10個(gè)JavaScript難點(diǎn),你可能還不知道,不著急,本文為大家一一列出,一一攻破,感興趣的小伙伴們可以參考一下2017-07-07
JS hasOwnProperty()方法檢測一個(gè)屬性是否是對象的自有屬性的方法
這篇文章主要介紹了JS hasOwnProperty()方法檢測一個(gè)屬性是否是對象的自有屬性的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
javascript中的循環(huán)語句for語句深入理解
for循環(huán)是多數(shù)語言都有的。在javascript中,for循環(huán)有幾種不同的使用情況,下面為大家一一介紹下2014-04-04

