[英]Move zeroes in array using ES6 features
我是ES6的新手,尝试创建一个函数,在数组的最后位置移动数组中的所有零,同时保留数组的原始顺序Eg [1,0,0,0,2,3,4,5]
=> [1,2,3,4,5,0,0,0]
function moveZeros (arr) {
let zeroArr = [];
for(let i = 0;i < arr.length;i++) {
if (arr[i] == 0) {
zeroArr.push(arr[i]);
arr.splice(i, 1);
}
}
arr.push(...zeroArr);
return arr;
}
这是我的代码,它的工作正常,但我认为使用一些ES6功能可以更短。 有人可以提供更好的解决方案
这可以使用filter
函数和spread
运算符轻松解决。
const moveZeros = arr => {
const z = arr.filter(a => a === 0); // get all zeroes
const nZ = arr.filter(a => a !== 0); // get all non zeroes
return [...nZ, ...z]; // put the zeroes on the last position
};
根据评论的要求: sort
怎么sort
?
arr.sort((a, b) => -!b)
肯定性能较差,但赫拉更短
旧
Onecompileman得到了一个好的解决方案,但由于OP需要“更短”的解决方案,我认为我们可以减少一些不必要的部分:
const moveZeros = a => [...a.filter(x => !!x), ...a.filter(x => !x)]
@ lucifer63提供了一个简短而且很好的解决方案,但是double not operator
既无用又令人困惑,删除它你会得到改进:
const moveZeros = z => [...z.filter(a => a), ...z.filter(a => !a)] moveZeros([1,0,0,0,2,3,4,5]) // [1, 2, 3, 4, 5, 0, 0, 0]
您可以使用reduceRight
,如果元素为0,则使用push
或如果不是0则使用unshift
。
const arr = [1,0,0,0,2,3,4,5]; const res = arr.reduceRight((r, e) => (e === 0 ? r.push(e) : r.unshift(e), r), []) console.log(res)
您可以通过将结果数组拼接在实际位置或调整后的索引来减少数组,该索引计算非空值。
function moveZeroes(array) { return array.reduce((i => (r, v, j) => (r.splice(!v ? j : i++, 0, v), r))(0), []); } console.log(moveZeroes([1, 0, 0, 0, 2, 3, 4, 5]));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.