сравнение строки с вложенным объектом - PullRequest
1 голос
/ 07 марта 2020

Я довольно новичок в изучении кода. Извините, если это глупый вопрос.

У меня есть база данных вложенных объектов, в которой я хочу найти имя персонажа, а затем вернуть мне, кто он такой. Но пока я могу найти только решения, которые ищут объекты верхнего уровня или для массивов, и у меня заканчиваются идеи. Можно ли глубоко искать имя типа «Фара», а затем каким-то образом вернуть «символы Олис»?

Заранее спасибо за любые советы, которые вы, ребята, могли бы получить!

{
  "olis characters": {
    "0": {
      "name": "Farah",
      "class": "rogue",
      "level": 74
    },
    "1": {
      "name": "Grop",
      "class": "paladin",
      "level": 31
    },
    "2": {
      "name": "Skolmr",
      "class": "druid",
      "level": 85,
    }
  },
  "chris characters": {
    "0": {
      "name": "Trygve",
      "class": "bard",
      "level": 28
    },
    "1": {
      "name": "Brusi",
      "class": "rogue",
      "level": 10
    },
    "2": {
      "name": "Steini",
      "class": "skald",
      "level": 58
    }
  }
}


Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Как таковые, ваши данные немного странные. У вас есть и объект с цифрами c ключей, который предполагает, что это должен быть массив. Сказав, что вы все еще можете искать через Object.values, чтобы получить данные, которые вы хотите.

let data = {"olis characters": {"0": {"name": "Farah","class": "rogue","level": 74},"1": {"name": "Grop","class": "paladin","level": 31},"2": {"name": "Skolmr","class": "druid","level": 85,}},"chris characters": {"0": {"name": "Trygve","class": "bard","level": 28},"1": {"name": "Brusi","class": "rogue","level": 10},"2": {"name": "Steini","class": "skald","level": 58}}}


function findChar(name, data) {
  for (let charGroup of Object.values(data)) {
    let found = Object.values(charGroup).find(char => char.name === name)
    if (found) return found
  }
}

console.log(findChar('Grop', data))
console.log(findChar('Brusi', data))

// will return undefined if the name is not there:
console.log(findChar('Mark', data))

Если вы изменили модель данных на простой массив, например:

let data = {
    "olis characters": [{
        "name": "Farah",
        "class": "rogue",
        "level": 74
      },
      {
        "name": "Grop",
        "class": "paladin",
        "level": 31
      }
    ],
    "chris characters": [{
        "name": "Trygve",
        "class": "bard",
        "level": 28
      },
      // ...
    ]
 }

... вы можете избежать одного из этих Object.values и использовать поиск напрямую.

function findChar(name, data){
   for (let charGroup of Object.values(data)){
      let found = charGroup.find(char => char.name === name)
      if (found) return found
   }
 }
0 голосов
/ 07 марта 2020

Становится все труднее запустить все oop через такой объект, возможно, объект объектов не является правильной структурой данных, рассмотрите возможность использования массива объектов.

Но может быть этот код может помочь вам

const data = {
    "olis characters": {
        "0": {
            "name": "Farah",
            "class": "rogue",
            "level": 74
        },
        "1": {
            "name": "Grop",
            "class": "paladin",
            "level": 31
        },
        "2": {
            "name": "Skolmr",
            "class": "druid",
            "level": 85,
        }
    },
    "chris characters": {
        "0": {
            "name": "Trygve",
            "class": "bard",
            "level": 28
        },
        "1": {
            "name": "Brusi",
            "class": "rogue",
            "level": 10
        },
        "2": {
            "name": "Steini",
            "class": "skald",
            "level": 58
        }
    }
}


Object.keys(data).forEach(item => {
    if(findItemByName('Farah', data[item])){
        console.log(item)
    }
})

function findItemByName(name, item) {
    let r = false;
    Object.keys(item).forEach(obj => {
        if (item[obj].name == name) {
            r = true;
        }

    });

    return r;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...