繁体   English   中英

在Javascript中“修剪”数组的更短/更好的答案?

[英]Shorter/Better answer to “trim” an array in Javascript?

我遇到了一个问题来修剪一个数组的前0和后0(所有元素都是0-9),例如,

  • 对于输入[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')

还有其他想法吗?

我们可以使用数组方法来做到这一点......

var a = [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, 1, 0, 2, 0, 0];
var b = trimZeros(a);

alert(a);
alert(b);

保持它非常简单,我们可以增加和减少边界线,以便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)); 

我想出了这个递归解决方案来删除数组开头或结尾的每个零点

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]

我希望它有所帮助

您可以使用for循环执行此操作:

 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> 

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM