2012-03-29 171 views
23
var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
var point = 'c'; 

如何可以分割 「ARR」 成兩個陣列基於 「點」 變量,如:拆分陣列成兩個陣列

['a', 'b'] 

['d', 'e', 'f'] 
+0

以及我做了兩次迭代和一些臨時變量,但我希望有一個更快的方法,用更少的代碼... – ellabeauty 2012-03-29 21:17:59

+0

將陣列始終組成單字符串的? – paislee 2012-03-29 21:18:49

+0

我建議你編寫一個基於「point」變量分割數組的函數。 – 2012-03-29 21:18:53

回答

28
var arr2 = ['a', 'b', 'c', 'd', 'e', 'f']; 
arr = arr2.splice(0, arr2.indexOf('c')); 

從arr2刪除'c':

arr2.splice(0,1); 

arr包含前兩個元素,arr2包含後三個元素。

這使得一些假設(如arr2將始終包含第一次賦值的'點'),所以根據需要添加一些正確性檢查的邊界情況。

+0

其實應該是'arr2.indexOf('c')+ 1'。 – Jon 2012-03-29 21:21:06

+0

固定...對於這個特定情況,至少。 – ramblinjan 2012-03-29 21:25:05

10

使用indexOfslice

http://jsfiddle.net/mendesjuan/8VtBk/

var indexToSplit = arr.indexOf(point); 
var first = arr.slice(0, indexToSplit); 
var second = arr.slice(indexToSplit + 1); 

的indexOf不可用在每一個瀏覽器, ,但上面的鏈接有一些可以用來代替 你可以使用一個片段像下面

if (!Array.indexOf) { 
    Array.prototype.indexOf = function (obj, start) { 
    for (var i = (start || 0); i < this.length; i++) { 
     if (this[i] == obj) { 
     return i; 
     } 
    } 
    return -1; 
    } 
} 
4

試試這個:

var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
var point = 'c'; 

var idx = arr.indexOf(point); 

arr.slice(0, idx) // ["a", "b"] 
arr.slice(idx + 1) // ["d", "e", "f"] 
0

另一項建議:

var segments = arr.join('').split(point).map(function(part) { 
    return part.split(''); 
}); 

現在segments包含數組的數組:

[["a", "b"], ["d", "e", "f"]] 

,並可以像

segments[ 0 ]; // ["a", "b"] 
segments[ 1 ]; // ["d", "e", "f"] 
+3

如果數組包含類似'abc'的東西,這將失敗 – 2012-03-29 21:23:22

+0

@JuanMendes:不是。爲什麼你這麼想? – jAndy 2012-03-29 21:25:13

+0

http://jsfiddle.net/mendesjuan/vjZsB/ – 2012-03-29 21:27:01

1
var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
var point = 'c'; 
var i = arr.indexOf(point); 
var firstHalf, secondHalf, end, start; 

if (i>0) { 
    firstHalf = arr.slice(0, i); 
    secondHalf = arr.slice(i + 1, arr.length);  
} 
獲得訪問210

//這應該讓你開始。你能想到你應該測試哪些邊緣案例來解決? //當點在數組的開始或結束時會發生什麼?

2
var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
var point = 'c'; 
Array.prototype.exists = function(search){ 
    for (var i=0; i<this.length; i++) { 
     if (this[i] == search) return i; 
    } 
    return false; 
} 

if(i=arr.exists(point)) 
{ 
    var neewArr=arr.splice(i); 
    neewArr.shift(0); 

    console.log(arr); // output: ["a", "b"] 
    console.log(neewArr); // output: ["d", "e", "f"] 
}​ 

這是一個example

+1

你的'exists'函數已經存在,它被稱爲'indexOf'。 – 2013-01-31 18:59:26

1

當拆分數組時,您將要創建兩個包含您正在拆分的新數組,例如arr1和arr2。爲了填充這個陣列,你需要這樣做:

var arr1, arr2; // new arrays 
int position = 0; // start position of second array 
    for(int i = 0; i <= arr.length(); i++){ 
     if(arr[i] = point){ //when it finds the variable it stops adding to first array 
      //starts adding to second array 
      for(int j = i+1; j <= arr.length; j++){ 
       arr2[position] = arr[j]; 
       position++; //because we want to add from beginning of array i used this variable 
      } 
     break; 
     } 
     // add to first array 
     else{ 
      arr1[i] = arr[i]; 
     } 
} 

有不同的方法可以做到這一點!祝你好運!

3

分享這個便利功能,我結束後訪問此頁面。

function chunkArray(arr,n){ 
    var chunkLength = Math.max(arr.length/n ,1); 
    var chunks = []; 
    for (var i = 0; i < n; i++) { 
     if(chunkLength*(i+1)<=arr.length)chunks.push(arr.slice(chunkLength*i, chunkLength*(i+1))); 
    } 
    return chunks; 
} 

使用範例:

chunkArray([1,2,3,4,5,6],2); 
//returns [[1,2,3],[4,5,6]] 

chunkArray([1,2,3,4,5,6,7],2); 
//returns [[1,2,3],[4,5,6,7]] 

chunkArray([1,2,3,4,5,6],3); 
//returns [[1,2],[3,4],[5,6]] 

chunkArray([1,2,3,4,5,6,7,8],3); 
//returns [[1,2],[3,4,5],[6,7,8]] 

chunkArray([1,2,3,4,5,6,7,8],42);//over chunk 
//returns [[1],[2],[3],[4],[5],[6],[7],[8]]