Я хочу посмотреть, есть ли категория в пакете, и если да, вернуть имя этого пакета.
Итак, если моя строка была «Pack1category1», я хочу вернуть «pack1».
Как я мог это сделать?
{
"paidTier": {
"categoryPacks": {
"pack1": {
"categories": [
"Pack1category1",
"Pack1category2",
"Pack1category3",
"Pack1category4",
"Pack1category5",
"Pack1category6"
]
},
"pack2": {
"categories": [
"Pack2category1",
"Pack2category2",
"Pack2category3",
"Pack2category4",
"Pack2category5",
"Pack2category6"
]
}
}
}
}
Что-то вроде этого:
var string = 'Pack1category1'
//Loop through paidTier and find string
return 'pack1';
или
var string = 'Pack2category5'
//Loop through paidTier and find string
return 'pack2';
Я занимался этим не менее 10 часов, и каждый метод, который я пробовал, потерпел неудачу. Пожалуйста помоги! ржу не могу
Я попытался использовать цикл for для перебора объекта, и я могу успешно захватить сами категории. Я также могу взять пакеты. У меня просто проблемы с соединением двух вместе.
Вы можете использовать Object.keys и фильтр и немного
categoryPacks
из исходных данныхcategoryPacks
мы проверяем свойство категорий, если оно включает keyToFind
, затем мы включаем его в окончательный вывод, иначе игнорируем его.let data = {"paidTier": {"categoryPacks": {"pack1": {"categories": ["Pack1category1","Pack1category2","Pack1category3","Pack1category4","Pack1category5","Pack1category6"]},"pack2": {"categories": ["Pack2category1","Pack2category2","Pack2category3","Pack2category4","Pack2category5","Pack2category6"]}}}}
let getKey = (keyToFind) => {
let {categoryPacks} = data.paidTier
let foundKeys = Object.keys(categoryPacks).filter(key => {
return categoryPacks[key].categories.some(val => val === keyToFind)
})
return foundKeys
}
console.info(getKey('Pack1category1'))
console.info(getKey('Pack2category5'))
console.info(getKey('Pack2category22'))
// assume `json` is your input object
var desiredCategory = 'Pack1category1';
var packCategories = json.paidTier.categoryPacks
var pack = Object.keys(packCategories).find(pack => packCategories[pack].categories.includes(desiredCategory))
console.info(pack) // 'pack1'
@code-maniac его ответ вернет список любых пакетов, соответствующих категории, мой ответ вернет только первое значение.
const packages = {
"paidTier": {
"categoryPacks": {
"pack1": {
"categories": [
"Pack1category1",
"Pack1category2",
"Pack1category3",
"Pack1category4",
"Pack1category5",
"Pack1category6"
]
},
"pack2": {
"categories": [
"Pack2category1",
"Pack2category2",
"Pack2category3",
"Pack2category4",
"Pack2category5",
"Pack2category6"
]
}
}
}
}
const findPack = (categoryName) => Object.keys(packages.paidTier.categoryPacks).find(packName =>
packages.paidTier.categoryPacks[packName].categories.includes(categoryName)
)
findPack('Pack2category1') // => "pack2"
Поскольку вы упомянули, что используете цикл for
для обхода объекта, я даю вам подход, использующий этот способ. Мы собираемся использовать для ... в для обхода объекта paidTier.cateroryPacks
и Массив.includes() для проверки, включает ли внутренний массив categories
искомую строку.
const data = {"paidTier":{"categoryPacks":{"pack1":{"categories":["Pack1category1","Pack1category2","Pack1category3","Pack1category4","Pack1category5","Pack1category6"]},"pack2":{"categories":["Pack2category1","Pack2category2","Pack2category3","Pack2category4","Pack2category5","Pack2category6"]}}}};
function getPack(catPacks, str)
{
for (const pack in catPacks)
{
if (catPacks[pack].categories.includes(str))
return pack;
}
return "No Pack Found!";
}
let catPacks = data.paidTier.categoryPacks;
console.info("Result for Pack1category1:", getPack(catPacks, "Pack1category1"));
console.info("Result for Pack2category5:", getPack(catPacks, "Pack2category5"));
console.info("Result for Pack3category5:", getPack(catPacks, "Pack3category5"));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
Этот метод прекрасно работает с уже имеющимся у меня программным потоком. Спасибо за Ваш ответ!