我有这个数组:
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]
答案 0 :(得分:1)
使用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) );
答案 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; }