首页 > 解决方案 > 如何在 JSON 中查找对象键的索引

问题描述

我尝试获取所选值的索引以显示所有更深层次的选项。
我的JSON样子是这样的:

{
  "flow": {
    "startmessage": "Hallo [name]",
    "questionmessage": "Waar heb je een vraag over?",
    "categories": [
      {
        "Openingstijden": [
          {"Hoe pas ik mijn openingstijden aan?": ["text 2"]},
          "Hoe upload ik een audio file?",
          "Hoe stel ik een doorschakeling in?",
          "Hoe stel ik een pauze in?"
        ]
      },
      {
        "Mijn bedrijfsgegevens": [
          "Hoe wijzig ik mijn bedrijfsgegevens?",
          "Hoe maak ik een nieuwe gebruiker aan?",
          "Mijn bedrijfsgegevens kloppen niet"
        ]
      },
      {
        "Mijn facturen": [
          "Hoe kan ik mijn facturen inzien?",
          "Ik heb geen factuur ontvangen",
          "Het bedrag op mijn factuur klopt niet!"
        ]
      },
      {
        "Mijn project": [
          "Hoe kan ik mijn projectstatus inzien?",
          "Waar kan ik mijn project terugvinden?",
          "Waarom moet ik een inventarisatiefomulier invullen?"
        ]
      },
      {
        "Mijn contract": [
          "Waar kan ik mijn contract terugvinden?",
          "De gegevens van mijn contract kloppen niet"
        ]
      },
      {
        "CDR's": [
          "Hoe exporteer ik mijn CDR's?",
          "Waarom werken mijn CDR's niet?",
          "Hoe filter ik mijn CDR's?"
        ]
      }
    ]
  }
}

我试图这样做以获得“Openingstijden”的索引。
flowJSON我给的对象的名称。

var index = flow['flow']['categories'].findIndex(function(category) {
   return category == "Openingstijden";
});

我也试过这个:

var index = Object.keys(flow['flow']['categories']).indexOf("Openingstijden");

然而这总是返回-1,所以它说它找不到它。
有谁知道如何找到索引以及如何使我的JSON结构更好?
也许我使用的结构太复杂了?!

标签: javascriptjqueryjsonobject

解决方案


每个数组项都是一个带有您要搜索的键的对象。使用您当前的结构,首先将每个数组项映射到其键:

const flow={flow:{startmessage:"Hallo [name]",questionmessage:"Waar heb je een vraag over?",categories:[{Openingstijden:[{"Hoe pas ik mijn openingstijden aan?":["text 2"]},"Hoe upload ik een audio file?","Hoe stel ik een doorschakeling in?","Hoe stel ik een pauze in?"]},{"Mijn bedrijfsgegevens":["Hoe wijzig ik mijn bedrijfsgegevens?","Hoe maak ik een nieuwe gebruiker aan?","Mijn bedrijfsgegevens kloppen niet"]},{"Mijn facturen":["Hoe kan ik mijn facturen inzien?","Ik heb geen factuur ontvangen","Het bedrag op mijn factuur klopt niet!"]},{"Mijn project":["Hoe kan ik mijn projectstatus inzien?","Waar kan ik mijn project terugvinden?","Waarom moet ik een inventarisatiefomulier invullen?"]},{"Mijn contract":["Waar kan ik mijn contract terugvinden?","De gegevens van mijn contract kloppen niet"]},{"CDR's":["Hoe exporteer ik mijn CDR's?","Waarom werken mijn CDR's niet?","Hoe filter ik mijn CDR's?"]}]}};


const keys = flow['flow']['categories'].map(arr => Object.keys(arr)[0]);
const index = keys.indexOf("Openingstijden");

console.log(index);

拥有只有一个属性的对象是很奇怪的,但是,您可能会考虑拥有categories一个对象数组,其中一个键是唯一的字符串(例如,Openingstijden),另一个键是数组,例如:

  {
    label: "Openingstijden",
    arr: [
      {"Hoe pas ik mijn openingstijden aan?": ["text 2"]},
      "Hoe upload ik een audio file?",
      "Hoe stel ik een doorschakeling in?",
      "Hoe stel ik een pauze in?"
    ]
  }

然后,您可以查找该label属性。

如果您经常想通过标签查找对象,则不要使用类别数组,而是使用对象,其中每个键都是标签,例如:

const flow = {
  "flow": {
    "startmessage": "Hallo [name]",
    "questionmessage": "Waar heb je een vraag over?",
    "categories": {
      "Openingstijden": [
        {"Hoe pas ik mijn openingstijden aan?": ["text 2"]},
        "Hoe upload ik een audio file?",
        "Hoe stel ik een doorschakeling in?",
        "Hoe stel ik een pauze in?"
      ]
    },
    "Mijn bedrijfsgegevens": [
      "Hoe wijzig ik mijn bedrijfsgegevens?",
      "Hoe maak ik een nieuwe gebruiker aan?",
      "Mijn bedrijfsgegevens kloppen niet"
    ],
    ...

推荐阅读