2

I have an array and I want to convert the empty/undefined values to null. I have tried the following:

let arr = []
arr[1] = 2
arr[7] = 10
arr = arr.map(x => x || null)

console.log(arr)

But the output of the snippet is not as desired:

[
  undefined,
  2,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  10
]

How do I replace these undefined values with nulls?

Note: Both vanilla JS and Lodash answers are acceptable.

1

2 Answers 2

5

What you have will work for an array that has undefined elements in it, but not for a sparse array with holes in it, because map doesn't visit the holes in a sparse array; instead, the resulting array just has holes in the same places.

If you want to map the holes as well, you can use Array.from with its mapping callback:

let arr = [];
arr[1] = 2;
arr[7] = 10;
arr = Array.from(arr, x => x || null);

console.log(arr);

Unlike map, Array.from will go through all indexes of the array, including holes, passing undefined as x for the holes in the array to the mapping callback.

Another option is a simple for-of loop, because iteration visits holes in sparse arrays (which is why Array.from works above):

let arr = [];
arr[1] = 2;
arr[7] = 10;
const newArr = [];
for (const value of arr) {
    newArr.push(value || null);
}
arr = newArr;

console.log(arr);


Note that x || null will replace all falsy values with null (including 0 and "", which often trips people up). To just replace undefined, use x ?? null instead:

let arr = [];
arr[1] = 2;
arr[7] = 10;
arr = Array.from(arr, x => x ?? null);

console.log(arr);

or

let arr = [];
arr[1] = 2;
arr[7] = 10;
const newArr = [];
for (const value of arr) {
    newArr.push(value ?? null);
}
arr = newArr;

console.log(arr);

x ?? y (nullish coalescing) is like x || y but only uses y if x evaluates to undefined or null.

Sign up to request clarification or add additional context in comments.

Comments

2

Try something very basic:

let arr = [];
arr[1] = 2; arr[7] = 10;
for(let i=0; i< arr.length; i++) {
    if(!arr[i]) arr[i]=null;
}
console.log(arr);

Output:

[
  null, 2,    null,
  null, null, null,
  null, 10
]

1 Comment

Also a useful option, though beware that this does two things differently than the OP seems to want. 1. It modifies the existing array rather than building a new one. 2. It replaces all falsy values with null (including 0 and "" and NaN, etc.), not just undefined ones or holes.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.