машинопись: логика для преобразования массива строк в пользовательский объект - PullRequest
0 голосов
/ 19 сентября 2018

Вот мое требование.Мне удалось достичь некоторого уровня в Java, но нам нужно переместить его в машинописный текст (на стороне клиента).

Примечание: Приведенный ниже вводный пример предназначен для целей и может изменяться динамически.

Ввод

var input = ["a.name", "a.type", "b.city.name" , "b.city.zip", "b.desc","c"];

Нам нужно создать служебную функцию, которая принимает вышеуказанный ввод и возвращает вывод, как показано ниже.

Вывод :

Должна быть строка не объект или что-либо еще.

"{ a { name, type }, b { city  {name, zip } , desc },  c }"

любая помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Я не вижу, чтобы машинопись играла какую-либо роль в вашем вопросе, но вот решение для построения запрашиваемой вами строки.Сначала я превращаю массив в объект с этими свойствами, затем создаю функцию, которая может превратить объект в строку, отформатированную так, как у вас

const input = ["a.name", "a.type", "b.city.name" , "b.city.zip", "b.desc","c"];

const arrayToObject = (arr) => {
  return arr.reduce((result, val) => {
    const path = val.split('.');
    let obj = result;
    path.forEach(key => {
      obj[key] = obj[key] || {};
      obj = obj[key];
    });
    return result;
  }, {});
}

const objectToString = (obj, name = '') => {
  const keys = Object.keys(obj);
  if (keys.length === 0) {
    return name;
  } 
  
  return `${name} { ${keys.map(k => objectToString(obj[k], k)).join(', ')} }`;
}

const arrayToString = arr => objectToString(arrayToObject(arr));

console.log(arrayToString(input));
0 голосов
/ 19 сентября 2018

Вот еще один вариант.Хитрость заключается в том, чтобы рекурсивно анализировать строки и сохранять промежуточные результаты в объекте.

    function dotStringToObject(remainder, parent) {
      if (remainder.indexOf('.') === -1) {
      	return parent[remainder] = true
      } else {
    	var subs = remainder.split('.');
        dotStringToObject(subs.slice(1).join('.'), (parent[subs[0]] || (parent[subs[0]] = {})))
      }
    }
    
    var output = {};
    ["a.name", "a.type", "b.city.name" , "b.city.zip", "b.desc","c"].forEach(function(entry) {
    	dotStringToObject(entry, output)
    });
    
    var res = JSON.stringify(output).replace(/\"/gi, ' ').replace(/\:|true/gi, '').replace(/\s,\s/gi, ', ');
    console.log(res)
    // Prints: { a { name, type }, b { city { name, zip }, desc }, c }
0 голосов
/ 19 сентября 2018

Вы можете сделать что-то вроде этого:

var input = ["a.name", "a.type", "b.city.name" , "b.city.zip", "b.desc","c"];
var output = {};
for(var i =0; i < input.length; i+=2){
    output[String.fromCharCode(i+97)] = {};
    output[String.fromCharCode(i+97)].name = input[i];
    output[String.fromCharCode(i+97)].type = input[i+1];
}
console.log(JSON.stringify(output));
...