1. 程式人生 > >JS(ES6)合併陣列

JS(ES6)合併陣列

  我們在專案過程中,有時候會遇到需要將兩個數組合併成為一個的情況。

  比如:

var a = [1,2,3];

var b = [4,5,6];

       有兩個陣列a、b,需求是將兩個數組合併成一個。方法如下:

  1、concat

    js的Array物件提供了一個叫concat()方法,連線兩個或更多的陣列,並返回結果。

var c = a.concat(b);//c=[1,2,3,4,5,6]

這裡有一個問題,concat方法連線a、b兩個陣列後,a、b兩個陣列的資料不變,同時會返回一個新的陣列。這樣當我們需要進行多次的數組合並時,會造成很大的記憶體浪費,所以這個方法肯定不是最好的。

  2、for迴圈

    大概的思路是:遍歷其中一個數組,把該陣列中的所有元素依次新增到另外一個數組中。直接上程式碼:

for(var i in b){
    a.push(b[i]);
}

    這樣的寫法可以解決第一種方案中對記憶體的浪費,但是會有另一個問題:醜!這麼說不是沒有道理,如果能只用一行程式碼就搞定,豈不快哉~

  3、apply

    函式的apply方法有一個特性,那就是func.apply(obj,argv),argv是一個數組。所以我們可以利用這點,直接上程式碼:

a.push.apply(a,b);
console.log('a.push.apply(a,b)==', a.push.apply(a,b))// 這裡返回的是一個boolean值 true or false 
console.log('a==', a)

    呼叫a.push這個函式例項的apply方法,同時把,b當作引數傳入,這樣a.push這個方法就會遍歷b陣列的所有元素,達到合併的效果。

    這裡可能有點繞,我們可以把b看成[4,5,6],變成這樣:

a.push.apply(a,[4,5,6]);

    然後上面的操作就等同於:

a.push(4,5,6);

    這樣就很清楚了!

  另外,還要注意兩個小問題:

  1)以上3種合併方法並沒有考慮過a、b兩個陣列誰的長度更小。

  所以好的做法是預先判斷a、b兩個陣列哪個更大,然後使用大數組合並小陣列,這樣就減少了陣列元素操作的次數!

  2)有時候我們不希望原陣列(a、b)改變,這時就只能使用concat了。

以下是ES6中合併陣列的寫法

1.擴充套件運算子提供了數組合並的新寫法。

formatEs6ConcatArr () {
  let arr1 = ['a', 'b']
  let arr2 = ['c', 'c']
  let arr3 = ['d', 'e']
  // ES5 的合併陣列
  // arr1.concat(arr2, arr3)
  // [ 'a', 'b', 'c', 'd', 'e' ]
  // ES6 的合併陣列
  let arr4 = [...arr1, ...arr2, ...arr3]
  console.log('arr4=', arr4)
  // [ 'a', 'b', 'c', 'd', 'e' ]
  // 不過,這兩種方法都是淺拷貝,使用的時候需要注意。
  const a1 = [{foo: 1}]
  const a2 = [{bar: 2}]
  const a3 = a1.concat(a2)
  const a4 = [...a1, ...a2]
  console.log(a3[0] === a1[0])// true
  console.log(a4[0] === a1[0])// true

}
上面程式碼中,a3和a4是用兩種不同方法合併而成的新陣列,但是它們的成員都是對原陣列成員的引用,這就是淺拷貝。如果修改了原陣列的成員,會同步反映到新陣列。

相關推薦

JS(ES6)合併陣列

  我們在專案過程中,有時候會遇到需要將兩個數組合併成為一個的情況。   比如: var a = [1,2,3]; var b = [4,5,6];        有兩個陣列a、b,需求是將兩個數組合併成一個。方法如下:   1、concat     js的Arr

JS ES6 迴圈陣列for of,迴圈json for in

import * as lib from '../util/constants'; var map = {}; var arr = 'userApi,CouponsApi,CoupondetailApi,addressApi,freeGetApi,categoryApi,pageApi,cartApi'.

JS合併兩個有序陣列 #陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nu

JavaScript(JS)常用陣列操作方法,包含ES6方法

一、concat() concat() 方法用於連線兩個或多個數組。該方法不會改變現有的陣列,僅會返回被連線陣列的一個副本。 var arr1 = [1,2,3]; var arr2 = [4,5]; var arr3 = arr1.concat(arr2); con

比較JS合併陣列的各種方法及其優劣

原文連結:  Combining JS Arrays原文日期: 2014-09-09翻譯日期: 2014-09-18翻譯人員: 鐵錨本文屬於JavaScript的基礎技能. 我們將學習結合/合併兩個JS陣列的各種常用方法,並比較各種方法的優缺點. 我們先來看看具體的場景:va

js 合併陣列

js concat是合併是返回一個新的陣列,並不是改變原來的陣列。這點小心 console.log(tmp.Table1) console.log(res.data.FObject.Table1)    var tmp = tmp.Table1.concat(res.dat

js如何處理兩個json陣列去除重複資料,然後合併陣列

如:var a = [{"id":"1001","name":"張三","age":"18","address":"北京市朝陽區","school":"朝陽區第二中學"},{"id":"1002","name":"李四","age":"15","address":"北京市海淀

js 合併陣列(兩種方式)

let arr1=[1,2,3]; let arr2=[4,5,6]; console.log(arr1.concat(arr2) )  //[1,2,3,4,5,6]       concat() 方法用於連線兩個或多個數組。 該方法不會改變現有的陣列,而僅僅會

js 剔除陣列中相同的值,合併陣列中相同項

實現效果如:["2013-01","2013-02","2013-03"] 程式碼如下: var a = ["2013-01","2013-01","2013-02","2013-02","2013-02","2013-03","2013-03"]; Array.pro

原生js物件合併物件拷貝Object.assign()方法的es5、es6實現

實現思路:支援es6的瀏覽器,可以直接用Object.assign()合併物件,只支援es5的瀏覽器,我們用pollyfill的方法。 作用 Object.assign() 方法用於把一個或多個源物件的可列舉屬性值複製到目標物件中,返回值為目標物件。 語法 Obj

js 合併陣列的一種方法

function a(first, second) { var len = +second.length, j = 0, i = first.length; console.log(len); for (; j < len; j++) { //很巧妙的在

JS程式設計——合併兩個有序陣列

問題描述:已知有兩個升序排序的陣列arr1,arr2,現要求將其合併為一個單調非遞減的陣列,並將其輸出。解決思路:歸併排序時間複雜度:O(n)程式碼:function mergeArray(arr1,a

js-ES6學習筆記-Set結構和Map結構

基本類 實例 記錄 lba post 而且 同名 方法 zha http://www.cnblogs.com/lonhon/ 1、ES6 提供了新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重復的值。 Set 本身是一個構造函數,用來生成 Set 數

js ES6 Set和Map數據結構詳解

... 文章 正常 col rfi 關註 ash comm 遍歷 這篇文章主要介紹了ES6學習筆記之Set和Map數據結構,結合實例形式詳細分析了ECMAScript中基本數據結構Set和Map的常用屬性與方法的功能、用法及相關註意事項,需要的朋友可以參考下

js es6 解構賦值

等號 {} 如果 math define col 對象 obj es6 解構賦值:es6允許按照一定的模式,從數組或對象中提取值 let [a,b,c] = [1,2,3]; let {a,b}= {a:1,b:2}; 對象 let {a,b}= {b:1,a:2

JS ES6的變量的結構賦值

req style fir 語句 多個 cti turn 清晰 rst 變量的結構賦值用戶很多 1、交換變量的值 let x = 1; let y = 2; [x,y] = [y,x] 上面的代碼交換變量x和變量y的值,這樣的寫法不僅簡潔,易讀,語義非常清

js 求和 json陣列 (統計)

js 統計 json陣列 的返回值 (求和) var data = JSON.parse(data); // console.log(data); (function() { var sum = 0; getSum(data)

array_merge合併陣列返回null的一個坑

合併陣列$arr1 + $arr2 和array_merge($arr1,$arr2); 1)鍵名為數字時,array_merge()不會覆蓋掉原來的值,但+合併陣列則會把最先出現的值作為最終結果返回,而把後面的陣列擁有相同鍵名的那些值“拋棄”掉(不是覆蓋) 2)鍵名為字元時,+仍然把最先出

ES6陣列擴充套件( entries(),keys(),values() )

ES6 提供三個新的方法 —— entries(),keys()和values() —— 用於**遍歷陣列**,它們都返回一個遍歷器物件(Array Iterator),可以用for…of迴圈進行遍歷,唯一的區別是keys()是對鍵名的遍歷、values()是對鍵值的遍歷,entries()

ES6陣列擴充套件( fill()方法 )

fill()函式,使用指定的元素替換原陣列內容,會改變原來的陣列。 該函式有三個引數: fill(value, start, end) value:替換值。 start:替換起始位置(陣列的下標),可以省略。 end:替換結束位置(陣列的下標),如果省略不寫就預設為陣列結束。有引數時為結