@dillix

Как проверить на javascript существование свойств у динамического объекта и создать их в случае отсутствия?

Друзья, пытаюсь на ноде сделать парсинг данных и построить дерево. В dataChapter прилетают строки вида Сайт1\Рубрика1\Заголовок1, надо из этих строк построить дерево вида:

root = {
  name: 'Сайт1',
  children: [{
    name: 'Рубрика1',
    children: [{
      name: 'Заголовок1'
    }]
  }]
}


Получается мне надо на каждой итерации проверять существует ли name на текущем уровне, если не существует, то добавлять его и создавать children для следующей итерации. Привожу кусок кода, на который ругается консоль:
...
var chapters = dataChapter.split('\\');
var root = {}
var tree_pointer = 'root';
for(var j=0, jlen = chapters.length; j < jlen; j++){
  if(!tree_pointer.hasOwnProperty("name")) {
    tree_pointer['name'] = chapters[j];
  }
  tree_pointer += '.children';
}
...

Подскажите как решить эту проблему? Чувствую что скорее всего не хватает eval()...
  • Вопрос задан
  • 234 просмотра
Решения вопроса 1
potapchino
@potapchino
function makeTree(data) {
	return data.reduceRight((acc, cur) => {
		return {
			name: cur,
			children:[acc]
		};
	}, { name: data.pop() });
}

spoiler
let dataChapter = 'a/bb/ccc'.split('/');
let root = makeTree(dataChapter);
console.log(JSON.stringify(root, null, 2));
// {
//   "name": "a",
//   "children": [
//     {
//       "name": "bb",
//       "children": [
//         {
//           "name": "ccc"
//         }
//       ]
//     }
//   ]
// }

Ответ написан
Пригласить эксперта
Ответы на вопрос 2
var tree_pointer = 'root'; - tree_pointer - это строка.
После этого вы от строки пытаетесь сделать hasOwnProperty. Очевидно, что любая консоль вам скажет о том, что такого метода нет.
Чего вы пытаетесь добиться конкатенацией строк - остается загадкой.
Ответ написан
Jman
@Jman
Frontend Developer
var chapters = dataChapter.split('\\');
var root = {}
var tree_pointer = {};  // зачем тут была строка?
for(var j=0, jlen = chapters.length; j < jlen; j++){
  if(!tree_pointer.hasOwnProperty("name")) {
    tree_pointer['name'] = chapters[j];
  }
  tree_pointer['children'] = {};  // зачем тут была строка?
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы