如果为空,则使用上一个定义的值填充数组,直到下一个定义的值

时间:2018-10-07 19:19:51

标签: javascript arrays

我有这个数组:

const arr = [2, 4, 8, 12, 15, null, null, null, 18, 39, null, 49, null, null]

如何用最后定义的值更新此数组中的空值,直到下一个定义的值,如果末尾没有更多的定义值,则停止。

所以看起来像这样:

 const arr = [2, 4, 8, 12, 15, 15, 15, 15, 18, 39, 39, 49, null, null]

4 个答案:

答案 0 :(得分:1)

使用mapforEach遍历数组。始终在null检查并重新分配后存储上次访问的值。

const arr = [2, 4, 8, 12, 15, null, null, null, 18, 39, null, 49, null, null];

function getFilledUpArray(array) {
    let lastDefinedElement;
    return array.map(element => {
        if (element === null) {
            element = lastDefinedElement; 
        }
        
        lastDefinedElement = element;
        return element;
    });    
}

console.log( getFilledUpArray(arr) );

答案 1 :(得分:0)

您可以将Array.reduce()数组的块用于null的组和不包含null的组。用Array.map()迭代组,如果null不是第一个或最后一个组,请在其之前填充数字。由spreading展平为Array.concat()

const arr = [2, 4, 8, 12, 15, null, null, null, 18, 39, null, 49, null, null];

const result = [].concat(...arr
  .reduce((r, n, i, a) => {
    if (!i || (n === null) === (a[i - 1] !== null)) {
      r.push([]);
    }

    r[r.length - 1].push(n);

    return r;
  }, [])
  .map((n, i, a) => {
    if(i && i < a.length - 1 && n[0] === null) {
      return [...n].fill(a[i - 1][a[i - 1].length - 1]);
    }
    
    return n;
  }));


console.log(result);

答案 2 :(得分:0)

您可以通过在数组上移动两个指针来做到这一点。这是一种很c的方式,但是它应该很快,并且可以保留尾巴null的值而不会跳过箍。

const arr = [ 2, 4, 8, 12, 15, null, null, null, 18, 39, null, 49, null, null]

for (let i=0, j=0; i < arr.length; i++){   
    if (arr[i] === null ) continue
    while(j<i) {                    // catch up to first pointer while filling in values
        arr[j] = arr[j-1] || null   // the null handles the case where the first value is null
        j++
    }
    j++
}
console.log(arr)

这将在适当位置编辑阵列。目前尚不清楚如果第一个值为null会发生什么。这只会保持null的合理性。

如果您要填写末尾的null值,只需将for循环上的测试更改为:j < arr.length,以使第二个指针赶上。

答案 3 :(得分:0)

您可以从末尾查找最后一个有效值,并忽略大于或等于索引的索引的更改。

此代码更改数组。如果需要,可以通过对最后一个非空值使用附加变量来映射新值。

var array = [2, 4, 8, 12, 15, null, null, null, 18, 39, null, 49, null, null],
    j = array.length;

while (array[--j] === null) ;

array.forEach((v, i, a) => {
    if (v === null && i < j) {
        a[i] = a[i - 1];
    }
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

新数组

var array = [2, 4, 8, 12, 15, null, null, null, 18, 39, null, 49, null, null],
    j = array.length,
    result;

while (array[--j] === null) ;

result = array.map((l => (v, i) => l = v === null && i < j ? l : v)());

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }