2017-06-20 18 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>