如何解决在Javascript中将结构化字符串数组转换为多级对象
我有一个结构化字符串数组,其中连接 |
作为一种格式,可以自我划分为多个级别。我想把它转换成多层次的结构化对象。
输入:
[
"clothes|tshirt|tshirt-for-kids","clothes|coat|raincoat","clothes|coat|leather-coat","clothes|tshirt|tshirt-for-men","clothes|tshirt|tshirt-for-men|luxury-tshirt",]
预期输出:
{
clothes: {
tshirt: {
tshirt-for-kids: {},tshirt-for-men: {
luxury-tshirt: {}
}
},coat: {
raincoat: {}
leather-coat: {}
}
}
}
解决方法
非常简单的任务 - 只需枚举数组并创建相关的对象键:
var myArray = [
"clothes|tshirt|tshirt-for-kids","clothes|coat|raincoat","clothes|coat|leather-coat","clothes|tshirt|tshirt-for-men","clothes|tshirt|tshirt-for-men|luxury-tshirt",]
var result = {},levels,current,temp;
while(myArray.length > 0)
{
levels = myArray.pop().split('|');
temp = result;
while(levels.length > 0)
{
current = levels.shift();
if(!(current in temp)) temp[current] = {};
temp = temp[current];
}
}
console.log(result);
你可以试试这个:
const input = [
"clothes|tshirt|tshirt-for-kids",];
function convertStrToObject(str,sep,obj) {
const sepIndex = str.indexOf(sep);
if (sepIndex == -1) {
obj[str] = obj[str] || {};
} else {
const key = str.substring(0,sepIndex);
obj[key] = obj[key] || {};
convertStrToObject(str.substring(sepIndex + 1),obj[key]);
}
}
const all = {};
for (let i = 0; i < input.length; ++i) {
convertStrToObject(input[i],"|",all);
}
console.log(all);
假设您打算收集属性,所有属性都有一个空对象作为叶节点。
// input
const input = [
"clothes|tshirt|tshirt-for-kids",];
// Here,we collect the properties
const out = {};
// map the input array,splitting each line at |
input.map(i => i.split('|'))
.filter(a => a.length > 0) // lets not entertain empty lines in input
.forEach(a => { // process each array of property names
// start at outermost level
let p = out;
// iterate properties
for(const v of a){
// create a property if it is not already there
if(!p.hasOwnProperty(v)){
p[v] = {};
}
// move to the nested level
p = p[v];
}
});
// lets see what we have created
console.log(out);
已经提出了许多解决方案,但令我惊讶的是没有一个涉及 reduce()
- 这对我来说似乎是更惯用的解决方案。
var array = [
"clothes|tshirt|tshirt-for-kids",]
var object = array.reduce(function (object,element) {
var keys = element.split("|")
keys.reduce(function (nextNestedObject,key) {
if (!nextNestedObject[key]) nextNestedObject[key] = {}
return nextNestedObject[key]
},object)
return object
},{})
console.log(object)
,
一个带有 eval
的衬垫
使用 eval
来评估如下字符串:
'o["clothes"]??={}'
'o["clothes"]["tshirt"]??={}'
'o["clothes"]["tshirt"]["tshirt-for-kids"]??={}'
const
data = ["clothes|tshirt|tshirt-for-kids","clothes|tshirt|tshirt-for-men|luxury-tshirt"],arr = data.map((d) => d.split("|")),res = arr.reduce((r,a) => (a.forEach((k,i) => eval(`r["${a.slice(0,i + 1).join('"]["')}"]??={}`)),r),{});
console.log(res)
没有 eval
的一个班轮
const
data = ["clothes|tshirt|tshirt-for-kids",res = data.reduce((r,d) => (d.split("|").reduce((o,k) => (o[k] ??= {},o[k]),{});
console.log(res)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。