【问题标题】:How do I search a string for keywords found in multi-dimensional array?如何在字符串中搜索多维数组中的关键字?
【发布时间】:2011-07-28 06:38:09
【问题描述】:

所以我有一些看起来像这样的数据:

stringToSearch = 'this string needs to be searched';

labels = ['keys 1-3','keys 4-6','keys 7-9'];

keywords =
    ['key1', 'key2', 'key3'],
    ['key4', 'key5', 'key6'],
    ['key7', 'key8', 'key9']
];

编辑: 基本上我想要实现的是,在字符串中搜索任何键。然后找到与键所在的组相对应的所有标签。

编辑:目标是传入字符串并取回标签。

string='这包含key5和key9';

所以它返回,标签'key 4-6'和'keys 7-9'

【问题讨论】:

  • “标记字符串”是什么意思?
  • 我还不确定我将如何做。计划在我弄清楚如何找到正确的值来标记它之后弄清楚。
  • 编辑了那部分,对此感到抱歉。
  • 我已添加 another answer 以解决您最新的问题

标签: javascript jquery arrays multidimensional-array node.js


【解决方案1】:

这是另一个解决方案,基于您最近的编辑:

stringToSearch = 'this string needs to be searched';

labelsToApply = {
    myFirstLabel: ['key1', 'key2', 'key3'],
    anotherLabel: ['key4', 'key5', 'key6'],
    lastLabel:    ['key7', 'key8', 'key9', 'key10', 'key11'],
}

function getLabels(str, labels) {
    var appliedLabels = [];
    $.each(labels, function(labelName, keywords) {
        $.each(keywords, function() {
             if(str.search(this) >= 0) {
                 appliedLabels.push(labelName);
                 return false;
             }
        });  
    });
    return appliedLabels;
}

alert(getLabels(stringToSearch, labelsToApply));

【讨论】:

  • 我认为这肯定可以解决问题,但我有一个问题。标签(以及键)是用户提交的字符串。将它们注入哈希的最佳方法是什么?
  • labelsToApply['newLabel'] = newKeys?
  • 好吧,我可能不太清楚哈希表是如何工作的。我可以通过声明 labelsToApply['newLabel'] = ['new','Keys'] 来传递新数据吗? 'newLabel' 是否需要以特定方式格式化,例如。没有空格?
  • @float:是的,这会很好。标签名称的格式根本不重要。如果您想为现有标签添加密钥,请执行labelsToApply['existingLabel'].push('additionalKey')
  • aweeeeeeeesommmmmmmmmmmeeeeeeeeeeeeeeeee :)
【解决方案2】:

或者可能是这个,因为不清楚你想要什么:

stringsToSearch = ['this string needs to be searched', '...']

keywords = {
    label1: {
        keys: ['key1', 'key2', 'key3'],
        matches: []
    },
    label2: {
        keys: ['key4', 'key5', 'key6'],
        matches: []
    },
    label3: {
        keys: ['key7', 'key8', 'key9', 'key10', 'key11'],
        matches: []
    }
}

$.each(keywords, function(labelName, label) {
    $.each(stringsToSearch, function(_, stringToSearch) {
        $.each(label.keys, function(_, key) {
            if(stringToSearch.search(key) >= 0) {
                label.matches.push(stringToSearch);
                return false;
            }
        });
    });
});

【讨论】:

    【解决方案3】:

    在普通的旧 Javascript 中,我会使用这样的东西:

    var stringToSearch = 'this string needs to be key2 searched key4';
    
    var Keywords = function(keywords, label) {
        this.keywords = keywords;
        this.label = label;
    }
    
    var keywords1 = new Keywords(['key1', 'key2', 'key3'], 'keys 1-3');
    var keywords2 = new Keywords(['key4', 'key5', 'key6'], 'keys 4-6');
    
    var keywordsArray = [ keywords1, keywords2 ];
    
    for (var i=0; i <keywordsArray.length; i++) {
        var keywordsEntry = keywordsArray[i];
        for(var j=0; j <keywordsEntry.keywords.length; j++) {
            // here you got the index of the occuring keyword
            if(stringToSearch.indexOf(keywordsEntry.keywords[j]) > 0) {
                // now do sth. with the label
                alert(keywordsEntry.label);
            }
        }
    }
    

    (绝对不是很好的编码,但这是为了给你一个开始。)

    【讨论】:

      【解决方案4】:

      试试这个:

      stringsToSearch = ['this string needs to be searched', '...']
      
      keywords = {
          firstGroup: {
              key1: [],
              key2: [],
              key3: []
          },
          secondGroup: {
              key4: [],
              key5: [],
              key6: []
          },
          thirdGroup: {
              key7: [],
              key8: [],
              key9: []
          }
      }
      
      $.each(keywords, function(groupName, keyGroup) {
          $.each(keyGroup, function(key, foundStrings) {
              $.each(stringsToSearch, function() {
                  if(this.search(key) >= 0)
                      foundStrings.push(this);
              });
          });
      });
      

      【讨论】:

      • 唯一需要做的就是跟踪组名,但这应该很简单。跟踪搜索字符串中找到每个目标的位置也是很好的。
      • “跟踪组名”是什么意思?它通过存储与组对象中的键匹配的字符串来做到这一点
      • 啊,我明白你的意思了——那就别介意了 :-)(保留子字符串的索引可能还是不错的。)
      • 不是原始问题的一部分。
      • @Eric 好吧,我只是关闭 original 原始问题,其中作者表示希望以某种方式“标记”搜索字符串。我只是认为知道这些职位会很方便;用字符串和索引推送一个小对象可能很容易。无论如何,我赞成你的答案,因为它非常优雅。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多