这是我的要求。我能够在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 }"
非常感谢您的帮助。
答案 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