typescript:将字符串数组转换为自定义对象的逻辑

时间:2018-09-19 18:06:19

标签: javascript typescript logic typescript2.0

这是我的要求。我能够在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 :(得分:3)

我看不到打字稿在您的问题中起什么作用,但这是构造您请求的字符串的解决方案。我首先将数组转换为具有这些属性的对象,然后有了一个函数,可以将对象转换为格式与您一样的字符串

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));

答案 1 :(得分:1)

这是另一种变化。技巧是递归地解析字符串并将中间结果存储在Object中。

    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 }

答案 2 :(得分:-1)

您可以执行以下操作:

Microsoft.EntityFrameworkCore