微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Javascript中将结构化字符串数组转换为多级对象

如何解决在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?