【问题标题】:typescript : logic to covert string array into custom object打字稿:将字符串数组转换为自定义对象的逻辑
【发布时间】:2018-09-19 18:06:18
【问题描述】:

这是我的要求。我能够在 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 }"

非常感谢任何帮助。

【问题讨论】:

  • { a { name, type }, b { city {name, zip } , desc }, c } 这是什么?那不是javascript。
  • 你什么都没试过?

标签: javascript typescript logic typescript2.0


【解决方案1】:

我没有看到打字稿在您的问题中扮演任何角色,但这是构建您请求的字符串的解决方案。我首先将数组转换为具有这些属性的对象,然后有一个函数可以将对象转换为格式化为您所拥有的字符串

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

【讨论】:

  • 将数组转换为对象可以解决问题,并使进一步的逻辑更容易。
【解决方案2】:

这是另一个变体。技巧是递归地解析字符串并将中间结果存储在一个对象中。

    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 }

【讨论】:

    【解决方案3】:

    你可以这样做:

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

    【讨论】:

    • 输出必须是字符串而不是对象
    • 天哪!这样做真的很难:“JSON.stringify(output);”。
    • 这样做不会输出与asker预期相同的结果
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多