2016-02-23 21 views
4

我遇到一個問題修剪第一0和最後的0的陣列的(所有元素是0-9),例如,更短/更好的回答「修剪」在Javascript中的數組?

  • 輸入[0, 1, 0, 2, 0],輸出應該是[1, 0, 2]

  • 對於輸入[1, 0, 2],輸出應該是[1, 0, 2]

  • 輸入[0, 1, 0, 2, 0, 0],輸出應該是[1, 0, 2]

其基本思想是找到第一個非零數字的索引和非零索引的最後一個索引,並拼接原始數組。

而我的方法是將數組更改爲字符串並修剪它,然後再次更改回數組。 trimArray=A=>A.join('').replace(/(^['0']*)|(['0']*$)/g, '').split('').map(a=>a-'0')

有沒有其他想法可以做到這一點?

+4

人,你試圖回答這個問題之前,請更仔細地閱讀。到目前爲止,已經有幾個答案沒有正確地讀取問題。 – Oka

+1

'function(){return [1,0,2]; }' – Blazemonger

回答

8

我們可以做到這一點只用陣列方法...

var a = [0, 0, 1, 0, 2, 0, 0]; 
while(a[0] === 0) { 
    a.shift(); 
} 

while(a[a.length - 1] === 0) { 
    a.pop(); 
} 
console.log(a) 

如果你需要保持原有的陣列完整:(https://jsfiddle.net/4q0un1kp/

function trimZeros(arr) 
{ 
    var result = [...arr]; 
    while(result[0] === 0) { 
     result.shift(); 
    } 

    while(result[result.length - 1] === 0) { 
     result.pop(); 
    } 
    return result; 
} 

var a = [0, 0, 1, 0, 2, 0, 0]; 
var b = trimZeros(a); 

alert(a); 
alert(b); 
+0

不錯和乾淨+1 – thatOneGuy

+0

擡頭,這兩者都a)突變數組,b)將修剪''0',以及_any_ falsy值。考慮使用嚴格的相等比較運算符'==='。 – Oka

+0

@Oka點......但我覺得他們可能超出了這個問題的範圍。然而,我會用基於方法的方法更新我的答案。 –

-2
var arr = [0, 0, 2, 3, 0, 0]; 

while (arr[0] === 0) { 
    arr.shift(); 
} 
while (arr[arr.length-1] === 0) { 
    arr.pop(); 
} 
+0

這將從兩端修剪只有一個零。 – JJJ

+0

@Juhana,據我所知這是作者nids - 「修剪數組的第一個0和最後一個0」 – IceJOKER

+0

不,「0」中的「s」表示複數。 「[全部]第一個零」和「[全部]最後零」。看看問題中的第三個例子。 – JJJ

0

我想出了這個遞歸解決方案去除數組開頭或結尾的每個零點

var array = [0,0,1,2,0,5,0,0,0,0]; 

// function to remove all zeros 
function removeZeros(array){ 

    if(array[0] === 0 && array[array.length-1] === 0){ 
    return removeZeros(array.slice(1,array.length-1)); 
    } 
    else if(array[0] === 0){ 
    array.shift(); 
    return removeZeros(array); 
    } 
    else if(array[array.length-1] === 0){ 
    array.pop(); 
    return removeZeros(array); 
    } 
    else{ 
    return array; 
    } 
} 

console.log(removeZeros(array)); //[1, 2, 0, 5] 

我希望它可以幫助

1

保持它非常簡單,我們可以遞增和遞減邊界線,以便slice應該從哪裏發生併到達。

該算法是O(n),並具有最小的函數調用的好處。

function trimZeros (array) { 
 
    var front, back, length = array.length; 
 

 
    if (!length) return []; 
 

 
    front = 0; 
 
    back = length - 1; 
 

 
    while (array[front] === 0) front++ 
 

 
    if (front === length) return []; 
 

 
    while (array[back] === 0) back--; 
 

 
    return array.slice(front, back + 1); 
 
} 
 

 
console.log(trimZeros([0, 1, 0, 2, 0, 0]))

或者,您也可以撰寫此爲這需要一個功能測試,創造一個更寬泛的版本的方法。此版本有邊界檢查(在試圖修剪undefined的情況下)。

if (!Array.prototype.trim) { 
 
    Array.prototype.trim = function (test) { 
 
    var start, end, length = this.length; 
 

 
    if (!length) return []; 
 

 
    start = 0; 
 
    end = length - 1; 
 

 
    while (start < length && test(this[start], start)) start++; 
 

 
    if (start === end) return []; 
 

 
    while (end >= 0 && test(this[end], end)) end--; 
 

 
    return this.slice(start, end + 1); 
 
    } 
 
} 
 

 
console.log([0, 0, 1, 0, 2, 0, 0, 0].trim(e => e === 0));

+1

這比接受的答案要乾淨得多。 –

0

你可以用做對循環:

function trimArray(arr) { 
 
    var lastIndex = arr.length - 1; 
 
    var low = { 
 
     found: false, 
 
     index: 0 
 
    }, 
 
    high = { 
 
     found: false, 
 
     index: arr.length 
 
    }; 
 

 
    for (var i = 0; i < arr.length; i++) { 
 
    if (!low.found && arr[i] !== 0) { 
 
     low.index = i; 
 
     low.found = true; 
 
    } 
 
    if (!high.found && arr[lastIndex - i] !== 0) { 
 
     high.index = (lastIndex - i) + 1; 
 
     high.found = true; 
 
    } 
 
    if (high.found && low.found) break; 
 
    } 
 

 
    if (high.found && low.found) { 
 
    var highCut = -(arr.length - high.index) 
 
    return arr.slice(low.index, highCut ? highCut : arr.length); 
 
    } else { 
 
    return []; 
 
    } 
 
} 
 

 
var testCases = [ 
 
    [0], 
 
    [0, 0], 
 
    [0, 1], 
 
    [0, 1, 0], 
 
    [0, 1, 0, 1, 0], 
 
    [0, 1, 0, 1], 
 
    [1, 0, 1, 0], 
 
    [1, 0, 1] 
 
    ]; 
 

 
var result = testCases.map(trimArray); 
 
results.innerHTML = JSON.stringify(result, null);
<pre id="results"></pre>

相關問題