【问题标题】:comparing a string to a nested object将字符串与嵌套对象进行比较
【发布时间】:2020-03-06 22:51:42
【问题描述】:

我对学习编码很陌生。很抱歉,如果这是一个愚蠢的问题。

我有一个嵌套对象数据库,我想搜索一个角色名称,然后返回给我它是谁的角色。但是,到目前为止,我只能找到搜索顶级对象或数组的解决方案,而且我的想法已经不多了。 是否可以深入搜索“Farah”之类的名称,然后以某种方式获取“olis characters”?

提前感谢你们的任何建议!

{
  "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
    }
  }
}


【问题讨论】:

  • 名称是否唯一?
  • 这能回答你的问题吗? Search a JavaScript object
  • 你的数据结构有点奇怪。你真的有一个带有 01 这样的键的对象还是一个数组?
  • @MarkMeyer 是的,名称是唯一的。而且我确信它是一个大对象,而不是一个数组。我知道数据结构看起来有点奇怪。如果我以某种方式将数字更改为角色名称会有帮助吗?它仍然是一个嵌套对象,然后我无法搜索.. 嗯
  • @lurf 如果名称是唯一的,您可以考虑使用稍微不同的数据格式,而不是像 01 这样的键,您使用键的名称,然后您可以测试无需迭代即可包含:if ('Trygve ' in data['olis characters']).

标签: javascript json object nested


【解决方案1】:

事实上,您的数据有点奇怪。你有和反对数字键,这表明它应该是一个数组。话虽如此,您仍然可以通过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 并直接使用 find。

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

【讨论】:

  • 这是一个巨大的帮助!非常感谢!我将数据库更改为您建议的内容,现在一切正常。你是最棒的!
【解决方案2】:

通过这样的对象运行循环变得更加困难,也许对象的对象不是正确的数据结构,请考虑使用对象数组。

但也许这段代码可以帮助你

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;
}

【讨论】:

  • 这个答案不是答案。充其量只是评论。
  • 我了解您来自哪里,我并没有对此或任何事情有攻击性,但是说“去学习 x”并在异地链接字面上并没有有资格作为答案的适当内容。就是这样。
猜你喜欢
  • 2023-03-23
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多