Javascript - 删除范围之间的数组值

时间:2018-01-25 03:05:13

标签: javascript

我想删除第一个数字和结束数字之间的所有空值。

我的代码似乎太复杂了。

喜欢看到一些更灵活的想法。

let values = [null, null, null, 1, 2, null, 3, null, 4, null, null, 5, 6, 7, null, null, null, null];

let startIndex = values.findIndex(n => (n !== null))

let endIndex = values.length - 1;
for ( ; endIndex > 0; endIndex--) {
  if (values[endIndex] !== null) break;
}

let arrayCopy = values.slice();

for(let i = endIndex; i > startIndex; i--) {
  if (values[i] === null) {
    arrayCopy.splice(i, 1);
  }
}

console.log(arrayCopy)

3 个答案:

答案 0 :(得分:1)

快速又脏,确定可以做得更好

var values = [null, null, null, 1, 2, null, 3, null, 4, null, null, 5, 6, 7, null, null, null, null];
var nonNull = values.filter(value => value !== null);
var result = [...values.slice(0, values.indexOf(nonNull[0])), ...nonNull, ...values.slice(values.lastIndexOf(nonNull[nonNull.length - 1]) + 1)];
console.log(result);

答案 1 :(得分:1)

我使用过滤器考虑索引或空值,它肯定是更清晰的IMO。

如果您的数组“非常大”,找到另一种计算endIndex的方法可能会很有趣,但如果您没有性能问题,我认为您可以将这部分代码保留为它是。

let values = [null, null, null, 1, 2, null, 3, null, 4, null, null, 5, 6, 7, null, null, null, null];

let startIndex = values.findIndex(n => (n !== null))
let endIndex = values.length - 1;
for ( ; endIndex > 0; endIndex--) {
  if (values[endIndex] !== null) break;
}

let arrayCopy = values.filter((v, i) => i < startIndex || i > endIndex || v !== null);

console.log(arrayCopy)

答案 2 :(得分:0)

这种方法使用reduce函数来查找数组开头和结尾的空值数,然后在非null元素之前和之后添加计数空值。

let values = [null, null, null, 1, 2, null, 3, null, 4, null, null, 5, 6, 7, null, null, null, null];
    
    var reduceFn = function(a,b){
      if (!a.finished && b === null){
        a.nullCount++;
      }
      if (b !== null){
        a.finished = true;
      }
      return a;
    };
    
    var start = {finished : false, nullCount:0};
    values.reduce(reduceFn,start);
    
    var end = {finished : false, nullCount:0};
    values.slice().reverse().reduce(reduceFn,end);
    
    result = Array(start.nullCount).fill(null);
    result.push.apply(result,values.filter(v => v !== null));
    result.push.apply(result,Array(end.nullCount).fill(null));
    
    
    console.log(result)

相关问题