如何在 JSON 中查找对象键的索引

Posted

技术标签:

【中文标题】如何在 JSON 中查找对象键的索引【英文标题】:How to find index of object key in JSON 【发布时间】:2020-01-19 01:21:24 【问题描述】:

我尝试获取所选值的索引以显示所有更深层次的选项。 我的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”的索引。flow 是我提供的JSON 对象的名称。

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

我也试过这个:

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

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

【问题讨论】:

试试flow['flow']['categories'].findindex((category) => 'Openingstijden' in obj) 您可以尝试将类别用作字典而不是字典列表 您可以使用 Lodash 轻松找到索引。 (lodash.com) _.findIndex(_.get(data,'flow.categories'),'Openingstijden'); 我已将流对象分配为数据。 【参考方案1】:

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

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"
    ],
    ...

【讨论】:

这里的地图太过分了【参考方案2】:

正如评论,这应该足够了

flow['flow']['categories'].findindex((category) => 'Openingstijden' in obj)

您的方法的问题是您试图获取数组的键而不是其中的对象。

示例:

var 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?"
        ]
      
    ]
  


var index = flow['flow']['categories'].findIndex((category) => 'Openingstijden' in category);

console.log(index)

【讨论】:

【参考方案3】:

假设包含流对象的对象被分配给data变量:

let data = 
  "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?"
    ]
  
]
  


for (let i of data.flow.categories) 
  for (let j in i) 
    if (j === "Openingstijden") 
      console.log("index is: " + j);
    
  

我应该注意,使用in 来迭代对象有点棘手,以防对象包含函数等。在这种情况下它没有,所以没有理由不使用。

【讨论】:

以上是关于如何在 JSON 中查找对象键的索引的主要内容,如果未能解决你的问题,请参考以下文章

在具有特定键的特定值的数组中查找对象的索引[重复]

如何在 JSON 对象中获取键的值 [重复]

在 Oracle PL/SQL 中,如何检查 JSON 对象是不是包含特定键的元素

如何使用改造获得没有对象键的 JSON 数组

如何解析具有相同键的不同数据类型的改造对象的json数组

如何在没有目标c的键的情况下解析json第一个对象?