如何在 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 中查找对象键的索引的主要内容,如果未能解决你的问题,请参考以下文章