【问题标题】:Does array contain?数组是否包含?
【发布时间】:2013-10-16 12:05:39
【问题描述】:

我在 JS 中有如下数组

 var wordselection = [
{ 'word': "Pomme", "gender": "m", },
{ "word": "Banane", "gender": "f", },
{ "word": "Ananas", "gender": "m", },
{ "word": "Chat", "gender": "f", },
{ "word": "Chien", "gender": "m", },
{ "word": "Poisson", "gender": "f", },

];   

function randomword(){
var chosen = wordselection[Math.floor(Math.random()*wordselection.length)].word
document.getElementById("wordinput").innerHTML=chosen;
}

我目前有 randomword 函数,它从数组中生成一个随机“单词”并将其放入 div 中(例如 pomme、chat)

我需要创建另一个函数来检查 div 中的随机词实际是什么,然后计算出数组中该词的性别是“m”还是“f”。

例如,如果随机词生成为“泊松”,我需要一个实现“泊松”生成的函数,并在数组中查看它是否为性别“f”

如何做到这一点?

【问题讨论】:

    标签: javascript arrays var


    【解决方案1】:

    这是一个简单的 JS 解决方案,可以满足您的需求:

    HTML

    <div id="test">Chat</div>
    

    JavaScript:

    var wordselection = [
    { 'word': "Pomme", "gender": "m" },
    { "word": "Banane", "gender": "f"},
    { "word": "Ananas", "gender": "m" },
    { "word": "Chat", "gender": "f" },
    { "word": "Chien", "gender": "m" },
    { "word": "Poisson", "gender": "f" }
    
    ];   
    
    var word = document.getElementById('test').innerHTML;
    
    var item = wordselection.filter(function(el){
      return el.word == word
    })[0];
    
    console.log(item && item.gender);
    

    如果 div 中的单词不在列表中,则会记录 undefined。

    演示:http://jsbin.com/AlOtINE/1/edit

    编辑:如果你需要检查很多这样的词,你可以通过将它们存储在地图中(在 JavaScript 中也称为对象)来获得更好的性能:

    var wordselection = {
      'Pomme' : 'm',
      'Banane' : 'f',
      'Ananas' : 'm',
      'Chat' : 'f',
      'Chien' : 'm',
      'Poisson' : 'f'
    }
    

    那么过滤部分就这么简单:

    console.log(wordselection[word]); // gender or undefined
    

    如果你从外部来源获得了wordselection,但仍想将其转换为上述格式,你可以使用这个sn-p:

    var optimizedwordselection;
    for (var i=0; i<wordselection.length; i++) {
      optimizedwordselection[wordselection.word] = wordselection.gender;
    }
    

    【讨论】:

      【解决方案2】:

      这是你想要使用 JQuery 的:

      JavaScript 代码:

       var wordselection = [
      { 'word': "Pomme", "gender": "m", },
      { "word": "Banane", "gender": "f", },
      { "word": "Ananas", "gender": "m", },
      { "word": "Chat", "gender": "f", },
      { "word": "Chien", "gender": "m", },
      { "word": "Poisson", "gender": "f", },
      
      ];  
      
      
           $.each( wordselection, function(key, value) {
      
               if ( value.word == $('#result').html() )
               {
                   alert(value.gender);
               }
           })
      

      http://jsfiddle.net/GWUxc/

      或者使用你的随机函数:

       var wordselection = [
      { 'word': "Pomme", "gender": "m", },
      { "word": "Banane", "gender": "f", },
      { "word": "Ananas", "gender": "m", },
      { "word": "Chat", "gender": "f", },
      { "word": "Chien", "gender": "m", },
      { "word": "Poisson", "gender": "f", },
      
      ];  
      
      function randomword(){
          var chosen = wordselection[Math.floor(Math.random()*wordselection.length)].word
      document.getElementById("wordinput").innerHTML=chosen;
      }
      
           randomword()
           $.each( wordselection, function(key, value) {
      
               if ( value.word == $('#wordinput').html() )
               {
                   alert(value.gender);
               }
           })
      

      http://jsfiddle.net/GWUxc/1/

      无论如何,我更喜欢使用filter 方法的解决方案:Does array contain?

      【讨论】:

        【解决方案3】:

        您可以使用任何其他库吗?如果我是你,我会使用 lo dash,它可以为你处理这种事情,而无需你自己迭代集合。例如,您需要做的就是:

        var wordselection = [
            { 'word': "Pomme", "gender": "m", },
            { "word": "Banane", "gender": "f", },
            { "word": "Ananas", "gender": "m", },
            { "word": "Chat", "gender": "f", },
            { "word": "Chien", "gender": "m", },
            { "word": "Poisson", "gender": "f", },
        ];
        
        var gender = _.find(wordSelection, { 'word': "Banane" }).gender;
        

        【讨论】:

          【解决方案4】:

          您可以循环访问您的 JSON 对象数组:

          var wordselection = [
            { 'word': "Pomme", "gender": "m", },
            { "word": "Banane", "gender": "f", },
            { "word": "Ananas", "gender": "m", },
            { "word": "Chat", "gender": "f", },
            { "word": "Chien", "gender": "m", },
            { "word": "Poisson", "gender": "f", },
          ]; 
          
          var selectedWord = "Chien";
          var selectedWordGender;
          for(var i = 0; i < wordselection.length; i++) {
            if(wordselection[i].word === selectedWord)
            {
                selectedWordGender = wordselection[i].gender;
            }
          }     
          
          console.log(selectedWordGender);
          

          【讨论】:

          • 我不知道filter 存在。我认为@Tibos 有最好的答案
          【解决方案5】:

          我不知道您的完整代码结构或实际实现。但是,我会以两种方式中的任何一种方式进行。可能有许多其他方法可以实现该解决方案。

          1. 使用http://api.jquery.com/html/复制DIV元素的HTML 在一个变量中。 HTML 将存储为字符串。在中搜索 字符串并查看“单词”是否存在。如果有或没有,采取 适当的行动。

          2. 创建一个临时数组。将键值对存储在该数组中。例如。 {“泊松”,“F”}。稍后当您想查找“单词”是否存在时,只需在数组中搜索它们的键是否存在。如果 KEY 存在,那么您可以随时检查它的值,即性别。

          var holder = new Array();
          
          function randomword(){
              var chosen = wordselection[Math.floor(Math.random()*wordselection.length)].word
          
              if( checkPost(chosen) ){
                  document.getElementById("wordinput").innerHTML=chosen;
                  holder['chosen'] = gender_variable;
              }
          }
          
          function checkPost(word){
              if( holder[word] === undefined ) {
                  return null;
              }
              return holder[word];
          }
          

          【讨论】:

          • 能否提供第二个选项的代码?
          • 我是 stackoverflow 的新手,不知道如何在注释中添加代码。所以添加一个新的答案。请检查。
          • 要将代码放在注释中,您可以使用以下字符将其括起来:`。此外,编辑答案而不是添加新答案几乎总是最好的方法。
          猜你喜欢
          • 1970-01-01
          • 2019-08-10
          • 2021-05-27
          • 2011-04-23
          • 2021-04-07
          • 2020-10-10
          • 2011-06-01
          • 2013-12-17
          • 2016-10-13
          相关资源
          最近更新 更多