Преобразование древовидного каталога файлов в объект JSON

1

Я пытаюсь преобразовать ответ каталога файла в объект JSON. Здесь копия ответа от функции каталога файла.

[ 'C:/Users/Freddy/System/storage/Objects/Users/1',
  'C:/Users/Freddy/System/storage/Objects/Users/1/email',
  'C:/Users/Freddy/System/storage/Objects/Users/1/email/[email protected]',
  'C:/Users/Freddy/System/storage/Objects/Users/1/etc',
  'C:/Users/Freddy/System/storage/Objects/Users/1/etc/etc',
  'C:/Users/Freddy/System/storage/Objects/Users/1/password',
  'C:/Users/Freddy/System/storage/Objects/Users/1/password/123123123213',
  'C:/Users/Freddy/System/storage/Objects/Users/1/username',
  'C:/Users/Freddy/System/storage/Objects/Users/1/username/Freddy1337' ]

И это тот факт, что я пытаюсь/стремясь достичь:

1 : {
    email: "[email protected]",
    etc: etc,
    password: "12313123",
    username: "Freddy1337"
}

Просто самый короткий путь в каталоге - это начало объекта JSON. Все предыдущие каталоги каталогов обрезаны.

Я попытался написать функцию, которая делает это, однако у меня были проблемы, так как папка "Пользователи" появляется дважды. Также функция неправильно перемещает узлы, она просто разрезает ее на заданные секции и склеивает их вместе. Это очень ужасно, мне немного стыдно.

function TreeToJson(directory, cutAfter){
    for (var i = directory.length - 1; i >= 0; i--) {
        directory[i] = directory[i].substr(directory[i].indexOf(cutAfter) + cutAfter.length, directory[i].length - 1);
        directory[i] = directory[i].split("/");
        directory[i].shift();
    };
    jsonA = {}; jsonB = {}; jsonC = {};
    for (var i = 0; i < directory.length; i++) {
        if(directory[i][2] != undefined){
        jsonB[directory[i][2]] = directory[i][3]
        }
    };
    jsonC[Number([directory[0][1]])] = jsonB;
    jsonA[directory[0][0]] = jsonC;
    return jsonA;
}
TreeToJson(files, 'Objects');

Если кто-то может показать мне лучший подход к преобразованию "Модели представления дерева" в "Объект JSON", я бы это оценил. Мне любопытно, на какие подходы будут принимать другие разработчики, а также то, что будет самым простым решением.

  • 0
    Всегда ли «значения» (например, 123123123213 ) сразу после «ключей» (например, password ) на входе?
  • 0
    Да, однако было бы здорово увидеть функцию без ограничения этих «ключей», являющихся самым глубоким свойством.
Теги:
treeview

2 ответа

1
Лучший ответ

Очень распространенная операция - извлечение части строки после последней косой черты, поэтому я бы сделал для нее функцию регулярного выражения. Определите начальное имя каталога из первого элемента массива, а затем используйте простой цикл for для итерации по остальной части массива, два раза к двум, извлечение ключей и значений:

const input = [
  'C:/Users/Freddy/System/storage/Objects/Users/1',
  'C:/Users/Freddy/System/storage/Objects/Users/1/email',
  'C:/Users/Freddy/System/storage/Objects/Users/1/email/[email protected]',
  'C:/Users/Freddy/System/storage/Objects/Users/1/etc',
  'C:/Users/Freddy/System/storage/Objects/Users/1/etc/etc',
  'C:/Users/Freddy/System/storage/Objects/Users/1/password',
  'C:/Users/Freddy/System/storage/Objects/Users/1/password/123123123213',
  'C:/Users/Freddy/System/storage/Objects/Users/1/username',
  'C:/Users/Freddy/System/storage/Objects/Users/1/username/Freddy1337'
];
const lastPart = str => str.match(/\/([^\/]+)$/)[1];
const [baseDirectory, ...keysVals] = input;
const dirName = lastPart(baseDirectory);
const dirObj = {};
for (let i = 0; i < keysVals.length; i += 2) {
  const key = lastPart(keysVals[i]);
  const val = lastPart(keysVals[i + 1]);
  dirObj[key] = val;
}
const output = { [dirName]: dirObj };
console.log(output);
  • 0
    Довольно творческий подход, немного любопытный на этой линии; [baseDirectory, ... keysVals] = вход; Такого раньше не было в JS. Спасибо за совет / отзыв приятель.
  • 0
    Это называется распространенным синтаксисом: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
1

вы можете разделить на "Пользователи" и .reduce() результирующий массив:

const data = ['C:/Users/Freddy/System/storage/Objects/Users/1',
  'C:/Users/Freddy/System/storage/Objects/Users/1/email',
  'C:/Users/Freddy/System/storage/Objects/Users/1/email/[email protected]',
  'C:/Users/Freddy/System/storage/Objects/Users/1/etc',
  'C:/Users/Freddy/System/storage/Objects/Users/1/etc/etc',
  'C:/Users/Freddy/System/storage/Objects/Users/1/password',
  'C:/Users/Freddy/System/storage/Objects/Users/1/password/123123123213',
  'C:/Users/Freddy/System/storage/Objects/Users/1/username',
  'C:/Users/Freddy/System/storage/Objects/Users/1/username/Freddy1337'
];

const objects = data
  .map(e => {
    return e.split('Users')[2];
  })
  .reduce((all, curr) => {
    let elems = curr.split('/');
    all[elems[1]] = all[elems[1]] || {};

    if ([elems[2]] && elems[3]) {
      Object.assign(all[elems[1]], {
        [elems[2]]: elems[3]
      })
    }
    
    // elems[1] is : 1
    // elems[2] is the key ( username, password .. )
    // elems[3] is the value ( Freddy1337 ... )
    
    return all;
  }, {})

console.log(objects)

EDIT: тот же код выше, который завернут в функцию:

const tree = ['C:/Users/Freddy/System/storage/Objects/Users/1',
  'C:/Users/Freddy/System/storage/Objects/Users/1/email',
  'C:/Users/Freddy/System/storage/Objects/Users/1/email/[email protected]',
  'C:/Users/Freddy/System/storage/Objects/Users/1/etc',
  'C:/Users/Freddy/System/storage/Objects/Users/1/etc/etc',
  'C:/Users/Freddy/System/storage/Objects/Users/1/password',
  'C:/Users/Freddy/System/storage/Objects/Users/1/password/123123123213',
  'C:/Users/Freddy/System/storage/Objects/Users/1/username',
  'C:/Users/Freddy/System/storage/Objects/Users/1/username/Freddy1337'
];

function TreeToJson(data, cutAfter){
  const objects = data
    .map(e => {
      return e.split(cutAfter)[1];
    })
    .reduce((all, curr) => {
      let elems = curr.split('/');
      all[elems[2]] = all[elems[2]] || {};

      if([elems[3]] && elems[4]){
        Object.assign(all[elems[2]], {
          [elems[3]] : elems[4]
        })
      }

      return all;
    }, {})
    
	return objects;
}

console.log(TreeToJson(tree, 'Objects'))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню