簡體   English   中英

使用ES6功能在陣列中移動零

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM