我有两个一维数组,a
和b
。 a
有值,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\])
。< / p>
我感谢所有帮助,帮助我找到更好,更快的方法。
答案 0 :(得分:2)
要遍历源一次,可以根据索引将值添加到特定数组。例如:
const source = [1, 2, 3, 4, 5, 6];
let arrs = [[],[]];
for(let i = 0; i< source.length; i++)
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++)
(i % 2 ? b : a)[Math.floor(i/2)] = a[i];
a.splice(a.length/2);
console.log(a);
console.log(b);
答案 1 :(得分: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);
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
&#13;
分区的谓词是身份功能,它不包含项目的索引,因此这会损害外部索引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);
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
&#13;
答案 2 :(得分: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迭代原始数组的次数
答案 3 :(得分:1)
Vanilla 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
,如果条件为真,则拼接项目并将其作为b
的第一项添加。