Как узнать, включает ли ключ значение и вернуть ключ на 2 уровня вверх? Алекса/JS

Я хочу посмотреть, есть ли категория в пакете, и если да, вернуть имя этого пакета.

Итак, если моя строка была «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 часов, и каждый метод, который я пробовал, потерпел неудачу. Пожалуйста помоги! ржу не могу

Я занимался этим не менее 10 часов, и каждый метод, который я пробовал, не удался.. Не могли бы вы включить одну из этих попыток?
Shidersz 28.05.2019 19:04

Я попытался использовать цикл for для перебора объекта, и я могу успешно захватить сами категории. Я также могу взять пакеты. У меня просто проблемы с соединением двух вместе.

Hattoncm 28.05.2019 19:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
32
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать 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 его ответ вернет список любых пакетов, соответствующих категории, мой ответ вернет только первое значение.

Nathan Gingrich 28.05.2019 19:11
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;}

Этот метод прекрасно работает с уже имеющимся у меня программным потоком. Спасибо за Ваш ответ!

Hattoncm 28.05.2019 19:50

Другие вопросы по теме