Javascript 将字符串数组转换为自定义结构
我需要将这个字符串数组转换成一个特殊的结构 这是我的输入字符串数组:Javascript 将字符串数组转换为自定义结构,javascript,Javascript,我需要将这个字符串数组转换成一个特殊的结构 这是我的输入字符串数组: ****************** "productone" "productone\level2\level3" "productwo" "productwo\level2\level3\level4" "productwo\level2\level3.1\level4\level5" "productwo\level2\level3.2\level4\level5" so can you imagine this:
******************
"productone"
"productone\level2\level3"
"productwo"
"productwo\level2\level3\level4"
"productwo\level2\level3.1\level4\level5"
"productwo\level2\level3.2\level4\level5"
so can you imagine this:
"memory"
"memory\ram"
"memory\ram\ddr\sodimm\533mhz\4gb"
"memory\ram\ddr\sodimm\533mhz\8gb"
"memory\ram\ddr\sodimm\533mhz\16gb"
"memory\ram\ddr\sodimm2\633mh\4gb
"memory\ram\ddr\sodimm2\633mh\16gb
"memory\disk"
and so on....
*******************
我需要这个输出(注意返回正确的订单输出):
有什么建议吗?您可以字符串#拆分数组中的每个字符串#映射
,并使用数组#还原右键
检查结果对象中的节点
和文本
值。如果某一级别存在text
键,请将对象重新分配到节点
键,并用当前的文本
值填充文本
键
var strings=[“productone”、“productone\\level2\\level3”、“productwo\\level2\\level3\\level4”];
const result=strings.map(string=>string.split('\\')).reduceRight((r,text,index)=>{
if(r['text'])
r['nodes']=[Object.assign({},r)];
r['text']=文本;
返回r;
},{}));
控制台日志(结果)代码>
作为控制台包装{max height:100%!important;top:0;}
您可以string#拆分数组中的每个字符串#map
并使用array#reduceRight
检查结果对象中的节点
和文本
值。如果某一级别存在text
键,请将对象重新分配到节点
键,并用当前的文本
值填充文本
键
var strings=[“productone”、“productone\\level2\\level3”、“productwo\\level2\\level3\\level4”];
const result=strings.map(string=>string.split('\\')).reduceRight((r,text,index)=>{
if(r['text'])
r['nodes']=[Object.assign({},r)];
r['text']=文本;
返回r;
},{}));
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
通过将给定的部件字符串作为用于收集所有数据的嵌套对象的标识,可以采用嵌套方法获取哈希表
稍后,此建议删除不需要的节点,但不包含内容
这种方法适用于未排序的数据
var数组=[“productone”、“productone\\level2\\level3”、“productwo\\level2\\level3\\level4”],
结果=[],
散列={{u0:result};
array.forEach(函数(a){
a、 拆分(“\\”).reduce(函数(r,k){
如果(!r[k]){
r[k]={{}:[]};
r、 _u.push({text:k,nodes:r[k]。});
}
返回r[k];
},散列);
});
结果。forEach(功能清洁(o){
if(o.nodes.length){
o、 forEach(clean);
}否则{
删除o节点;
}
});
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
通过将给定的部件字符串作为用于收集所有数据的嵌套对象的标识,可以采用嵌套方法获取哈希表
稍后,此建议删除不需要的节点,但不包含内容
这种方法适用于未排序的数据
var数组=[“productone”、“productone\\level2\\level3”、“productwo\\level2\\level3\\level4”],
结果=[],
散列={{u0:result};
array.forEach(函数(a){
a、 拆分(“\\”).reduce(函数(r,k){
如果(!r[k]){
r[k]={{}:[]};
r、 _u.push({text:k,nodes:r[k]。});
}
返回r[k];
},散列);
});
结果。forEach(功能清洁(o){
if(o.nodes.length){
o、 forEach(clean);
}否则{
删除o节点;
}
});
控制台日志(结果)代码>
。作为控制台包装器{max height:100%!important;top:0;}
我扔掉了以前的答案,用这个来代替
这应该正是你想要的
var src = [
"productone",
"productone\\level2\\level3",
"productwo\\level2\\level3\\level4",
"productone\\level2\\dog",
"productone\\level2\\dog\\bark",
"productwo\\level2\\level3a\\level4a",
"productwo\\level2\\level3\\level4\\level5",
"productwo\\food\\desserts\\cookies",
"productwo\\food\\desserts\\cakes",
"productwo\\food\\desserts\\pies",
"productone\\level2\\cat",
"productone\\level2\\cat\\meow"
]
function tempToObj(temp) {
var result = [];
Object.keys(temp).forEach(
function(key) {
var obj = {
text: key
};
var nodes = tempToObj(temp[key]);
if (nodes.length > 0) {
obj.nodes = nodes;
}
result.push(obj);
}
);
return result;
}
function strsToObj(strList) {
var result = [];
var tempResult = {};
function buildNode(parts, idx, obj) {
var key = parts[idx];
obj[key] = obj[key] || {};
idx++;
if (idx < parts.length) {
buildNode(parts, idx, obj[key]);
}
}
strList.forEach(
function(str) {
var parts = str.split('\\');
buildNode(parts, 0, tempResult);
}
);
return tempToObj(tempResult);
}
var obj = strsToObj(src);
console.log(JSON.stringify(obj,0,2));
我扔掉了以前的答案,用这个来代替
这应该正是你想要的
var src = [
"productone",
"productone\\level2\\level3",
"productwo\\level2\\level3\\level4",
"productone\\level2\\dog",
"productone\\level2\\dog\\bark",
"productwo\\level2\\level3a\\level4a",
"productwo\\level2\\level3\\level4\\level5",
"productwo\\food\\desserts\\cookies",
"productwo\\food\\desserts\\cakes",
"productwo\\food\\desserts\\pies",
"productone\\level2\\cat",
"productone\\level2\\cat\\meow"
]
function tempToObj(temp) {
var result = [];
Object.keys(temp).forEach(
function(key) {
var obj = {
text: key
};
var nodes = tempToObj(temp[key]);
if (nodes.length > 0) {
obj.nodes = nodes;
}
result.push(obj);
}
);
return result;
}
function strsToObj(strList) {
var result = [];
var tempResult = {};
function buildNode(parts, idx, obj) {
var key = parts[idx];
obj[key] = obj[key] || {};
idx++;
if (idx < parts.length) {
buildNode(parts, idx, obj[key]);
}
}
strList.forEach(
function(str) {
var parts = str.split('\\');
buildNode(parts, 0, tempResult);
}
);
return tempToObj(tempResult);
}
var obj = strsToObj(src);
console.log(JSON.stringify(obj,0,2));
我已经解决了我的问题,我已经转换成JavaScript纯代码
我已经解决了我的问题,我已经转换为JavaScript纯代码
这是一个对象数组,不是JSON。JSON是使用JSON.stringify()
将其转换为字符串时得到的。为什么要为productone
额外添加一行?在反斜杠上拆分字符串,然后使用循环创建嵌套对象。StackOverflow希望您这样做,我们也希望您这样做。请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅,并使用:)这是一个对象数组,而不是JSON。JSON是使用JSON.stringify()
将其转换为字符串时得到的。为什么要为productone
额外添加一行?在反斜杠上拆分字符串,然后使用循环创建嵌套对象。StackOverflow希望您这样做,我们也希望您这样做。请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅,并使用:)此解决方案复制productone。。。因此,这不是一个有效的解决方案。我需要检查每次的值,但我不知道这个解决方案如何复制productone。。。因此,这不是一个有效的解决方案。我每次都需要检查值,但我不知道如何检查。是的,这是一个非常好的解决方案,但不幸的是,不尊重数组的排序。我不得不说,如果能在原始问题中看到您的所有要求,那将是一件非常好的事。我真的很抱歉,真的,真的非常有帮助。不幸的是,我在测试后观察到了问题。非常感谢你,这是一个非常好的解决方案,但不幸的是,不尊重数组的排序。我不得不说,在你的原始问题中看到你的所有要求会很好。我真的很抱歉,真的,真的是一个很大的帮助。不幸的是,我在测试后观察到了问题。多谢各位
[
{
"text": "productone",
"nodes": [
{
"text": "level2",
"nodes": [
{
"text": "level3"
},
{
"text": "dog",
"nodes": [
{
"text": "bark"
}
]
},
{
"text": "cat",
"nodes": [
{
"text": "meow"
}
]
}
]
}
]
},
{
"text": "productwo",
"nodes": [
{
"text": "level2",
"nodes": [
{
"text": "level3",
"nodes": [
{
"text": "level4",
"nodes": [
{
"text": "level5"
}
]
}
]
},
{
"text": "level3a",
"nodes": [
{
"text": "level4a"
}
]
}
]
},
{
"text": "food",
"nodes": [
{
"text": "desserts",
"nodes": [
{
"text": "cookies"
},
{
"text": "cakes"
},
{
"text": "pies"
}
]
}
]
}
]
}
]