我有这个数组:
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]
使用map或forEach遍历数组。始终在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) );
你可以使用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);
您可以通过沿阵列走两个指针来完成此操作。这是一个很好的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
以允许第二个指针赶上。
您可以从末尾查找最后一个有效值,并省略大于或等于索引的索引的更改。
此代码更改了数组。如果需要,可以使用附加变量为最后一个非空值映射新值。
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; }