Demigodd
@Demigodd

Как профессионально парсить обьект и в конце получить массив с ключами?

Вот пример на Repl.

Существует обьект obj(из примера), как его парсить так что бы получить только те обьекты у которых значение show равно true. И в конце в массиве, вывести имена всех этих обьектов( у кого show: true ).
Проблема в ток что нужно считвать еще и child.
То есть у каждого обьекта может быть и свой child у которого в свою очередь, есть обьекты со значением show.
  • Вопрос задан
  • 2626 просмотров
Решения вопроса 3
0xD34F
@0xD34F Куратор тега JavaScript
const getShowPaths = (obj, path = '') => Object
  .entries(obj || {})
  .filter(n => n[1].show)
  .reduce((acc, n) => {
    const p = path ? `${path}.child.${n[0]}` : n[0];
    return acc.concat(p, ...getShowPaths(n[1].child, p));
  }, []);


const result = getShowPaths(obj);
Ответ написан
Комментировать
Xuxicheta
@Xuxicheta
инженер
function flat(obj) {
  let arr = [];
  Object.entries(obj).forEach(([key, value]) => {
    if (value.show) {
      arr.push(key);
      if (value.child) {
        arr = arr.concat(flat(value.child));
      }
    }
  })
  return arr;
}

const arr = flat(obj);

Можно сделать через reduce, но я не люблю применять его без особой необходимости, с ним хуже читабельность.
Ответ написан
AnnTHony
@AnnTHony
Интроверт
function parseObject(object, name=undefined, result=[]) {
    for (let key in object) {
        if (object.hasOwnProperty(key)) {
            if (key === 'show' && object['show']) {
                result.push(name);
            }

            if (Object.prototype.toString.call(object[key]) === '[object Object]') {
                parseObject(object[key], name ? `${name}.${key}` : `${key}`, result);
            }
        }
    }

    return result;
}

console.log(parseObject(obj));  // [ 'obj1', 'obj2', 'obj2.child.child2', 'obj3' ]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Grazdan
function rec (doIt) {
  return Object.keys(doIt)
  .filter(key => doIt[key].show)
  .map(key => doIt[key].child ? [key, [key, `${key}.child.${rec(doIt[key].child)}`] : key)
  .reduce((acc, val) => acc.concat(val), [])
}

console.log(rec(obj));
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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