Задать вопрос
riddlr
@riddlr

Как отфильтровать значения объекта?

Объекты тяжелей заходят, нежели массивы.

post: {
  comments: {
    1: {
      id: 1,
      parent: null
    },
    2: {
      id: 2,
      parent: 3
    },
    3: {
      id: 3,
      parent: 1
    },
    4: {
      id: 4,
      parent: null
    }
  }
}


Как получить объект, с ключами, у которых parent: null?

post: {
  comments: {
    1: {
      id: 1,
      parent: null
    },
    4: {
      id: 4,
      parent: null
    }
  }
}


АПД сделал так, есть другие способы?

let n = {}
for (i in post.comments) {
  if (post.comments[i].parent === null) {
    Object.assign(n, {[i]: post.comments[i]})
  }
}
  • Вопрос задан
  • 2583 просмотра
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Если делать ровно то, что спрошено:

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',
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы