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

问题描述 投票:-2回答:4

我有这个数组:

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]
javascript arrays
4个回答
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) );

0
投票

你可以使用Array.reduce() chunk数组用于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);

0
投票

您可以通过沿阵列走两个指针来完成此操作。这是一个很好的c-ish方法,但它应该是快速的,它允许留下尾部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以允许第二个指针赶上。


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; }
© www.soinside.com 2019 - 2024. All rights reserved.