【问题标题】:print out object array based on level根据级别打印出对象数组
【发布时间】:2022-01-09 17:24:21
【问题描述】:

我想打印一个按级别格式化的列表。我拥有的是一个对象数组。

每个对象都有一个级别,例如 0、1、2。0 是最上层,2 是最内层。我想打印出每个内部级别的缩进列表

所以列表看起来像这样

0
    1
    1
         2
         2

我的代码是什么样子的:

for (let category of json.categories) {
  if ((category.level = 0)) {
    console.log(
      category.category + "https://www.example.com/" + category.seo_name
    );
  }

  else if ((category.level = 1)) {
    console.log(
      "   " +
        category.category +
        " " +
        "https://www.example.com/" +
        category.seo_name
    );
  }

 else if ((category.level = 2)) {
    console.log(
      "     " +
        category.category +
        " " +
        "https://www.example.com/" +
        category.seo_name
    );
  }
}

这看起来确实很笨重,更糟糕的是,它不起作用而且没有缩进。

对象示例:

const json = {
  categories: [
    {
      category_id: "198",
      category: "Appliances",
      seo_name: "appliances",
      level:0
    },
    {
      category_id: "184",
      category: "Industrial Appliances",
      seo_name: "industrial-appliances",
      level:1
    },
  ],
  params: {
    visible: false,
    sort_order: "asc",
  },
};

【问题讨论】:

  • 你想在console.log中这样打印吗?
  • ifs 中的条件应该有 == 。单个 = 对位进行验证,而不是对您需要的值进行验证
  • 一旦您获得了级别信息,请使用value.toString().padStart(n*level, " "),其中n 可以使其尽可能宽。
  • 为什么不向我们展示您的 OBJECT(如果不是字符串,则不是 JSON)

标签: javascript arrays object


【解决方案1】:

如何使用 PRE 并像评论中建议的那样使用关卡来分隔它

const obj = { categories: [ { category_id: "198", category: "Appliances", seo_name: "appliances", level:0 }, { category_id: "184", category: "Industrial Appliances", seo_name: "industrial-appliances", level:1 }, { category_id: "187", category: "Appliances", seo_name: "appliances", level:2 }, ], params: { visible: false, sort_order: "asc", }, };

const container = document.querySelector('pre');
container.innerHTML = obj.categories
  .map(({level,category,seo_name}) => `${"".padStart(level,"\t")}${category} https://www.example.com/${seo_name}`)
  .join("\n")
<pre></pre>

【讨论】:

  • 如果你发布了你的对象,那么我可以看看。
  • 请举个分类对象的例子
  • 已编辑问题。
  • 查看更新的答案
  • 我将 json 重命名为 obj,因为 JSON 是字符串而不是对象 - 我还添加了 2 级
【解决方案2】:

var data = [{ level: 0 }, { level: 1 }, { level: 1 }, { level: 2 }, { level: 2 }];

for (let obj of data) {
  let result = "";
  result = ' '.repeat(obj.level * 4) + obj.level;
  console.log(result)
}

如果你想要一行。

var data = [{ level: 0 }, { level: 1 }, { level: 1 }, { level: 2 }, { level: 2 }];

data.forEach(obj => console.log(' '.repeat(obj.level * 4) + obj.level))

【讨论】:

  • 谢谢!第一个选项似乎效率低下(仍然有效),因为您每次都在初始化一个字符串,但第二个选项更简洁直观!
【解决方案3】:

您正在使用= 而不是==if 条件内分配值。此外,更简洁的方法是使用switch 而不是if(在这种情况下和我认为至少是这样),并使用一些循环,以便您可以轻松更改可以随时在缩进中留下的空格数像您在代码中那样手动计算它。

var data = [{ level: 0 }, { level: 1 }, { level: 1 }, { level: 2 }, { level: 2 }];

for (let element of data) {
  let result = "";
  switch (element.level) {
    case 1:
      for (let index = 0; index < 4; index++)
        result += " ";
      result += element.level;
      break;
    case 2:
      for (let index = 0; index < 8; index++)
        result += " ";
      result += element.level;
      break;
    default:
      result += element.level;
  }
  console.log(result)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2021-12-23
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多