2017-06-20 17 views
4

我有兩個一維陣列,aba有值,b爲空。 a的長度是偶數。我想從a中刪除所有其他值,並將它們移動到b,順序與它們放置在a中的順序相同。將陣列中的每個其他值移動到新陣列中

var a = [1, 2, 3, 4, 5, 6], b = []; 

成爲

var a = [1, 3, 5], b = [2, 4, 6]; 

我想通filter會做的伎倆,但我不與它自a平均長度爲300-400的性能是幸福的。

b = a.filter((i, idx) => { 
    return idx % 2 == 0; 
}); 
a = a.filter((i, idx) => { 
    return idx % 2 == 1; 
}); 

我也一直在尋找lodash,看看是否能文庫任何可能幫助我,這就是近正是我要找的是_.chunk(array, \[size=1\])的唯一功能。

我很感激任何和所有的幫助,以幫助我找出一個更好,更快的方式來做到這一點。

+0

過濾元件400的一小陣列應幾乎瞬時的。你是什​​麼意思,你對錶演不滿意?你有沒有注意到延誤?它可以在一個單一的迭代來完成,但不會太大的差別 – slezica

+0

你可以基準性能給出答案,將是非常有趣的,看看如何lodash對執行香草JS如: – Hinrich

+0

@slezica我同意它不會使與400個元素的差異。不過,如果這被執行了很多次,它可以。 – Hinrich

回答

1

香草JS ES5,簡單幹淨。

var a = [1, 2, 3, 4, 5, 6], b = []; 

for(var i = a.length-1; i >= 0; i--) { 
    if(i % 2 === 1) { 
    b.unshift(a.splice(i, 1)[0]) 
    } 
} 

基本上,它是通過迭代a向後,並且如果條件爲真剪接的項目UND將其添加爲的b第一項。

1

您可以獲得的最佳性能是0(n)或線性時間,因爲您必須迭代整個陣列。有什麼可以幫助減少循環的次數

var a=[]; 
var b=[]; 
function splitArray(arr) 
{ 
    for (var i=0;i<arr.length;++i) 
     { 
      if (arr[i]%2 == 0) 
       b.push(arr[i]); 
      else 
       a.push(arr[i]); 
     } 
} 

這樣做是通過源一度減少了需要通過從2原數組迭代到1

2

要循環的次數,值可以根據索引添加到特定的數組中。例如:

const source = [1, 2, 3, 4, 5, 6]; 
 

 
let arrs = [[],[]]; 
 
for(let i = 0; i< source.length; i++) 
 
\t arrs[i%2].push(source[i]); 
 
let [a,b] = arrs; 
 
    
 
console.log(a); 
 
console.log(b);

另外,如果要改變原來的數組是很重要的,a可以在直接迭代填補,因爲正在處理該指數總是領先填充的一種:

let a = [1, 2, 3, 4, 5, 6], b= []; 
 

 
for(let i = 0; i< a.length; i++) 
 
\t (i % 2 ? b : a)[Math.floor(i/2)] = a[i]; 
 
    
 
a.splice(a.length/2); 
 
    
 
console.log(a); 
 
console.log(b);

+0

香草JS優秀的答案...我喜歡它更不是依靠一個圖書館更好。 – chazsolo

2

既然你提到lodash你可以用_.partition做到這一點:

let a = [1, 2, 3, 4, 5, 6]; 
 
let b = []; 
 
let i = -1; 
 

 
[a, b] = _.partition(a, (item) => i++ % 2); 
 

 
console.log(a); 
 
console.log(b);
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

分區的謂語是身份的功能,其中不包括該項目的指標,所以這個自帶的妥協外部索引i

當然,你總是可以換這個功能整合到它自己的功能:

const splitEvenOdd = (array, i = -1) => _.partition(array, (item) => i++ % 2); 
 

 
let a = [1, 2, 3, 4, 5, 6]; 
 
let b = []; 
 

 
[a, b] = splitEvenOdd(a); 
 

 
console.log(a); 
 
console.log(b);
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>