Если делать ровно то, что спрошено:
const rootComments = Object
.entries(comments)
.reduce((acc, [ k, v ]) => v.parent === null ? { ...acc, [k]: v } : acc, {});
// или
const rootComments = {};
for (const k of Object.keys(comments)) {
if (comments[k].parent === null) {
rootComments[k] = comments[k];
}
}
Но вообще, можно решить более общую задачу - собрать дерево. Которое и будет тем результатом, который вам требуется - объектом, содержащим корневые узлы (конечно, не без дополнения в виде объектов вложенных узлов):
function createTree({
data,
key = 'id',
parentKey = 'parentId',
childrenKey = 'children',
}) {
const tree = data.reduce((acc, n) => (
acc[n[key]] = { ...n, [childrenKey]: {} },
acc
), {});
return Object.values(tree).reduce((acc, n) => {
const p = tree[n[parentKey]];
(p ? p[childrenKey] : acc)[n[key]] = n;
return acc;
}, {});
}
const commentsTree = createTree({
data: Object.values(comments),
parentKey: 'parent',
});