如果object包含数组中的任何子字符串

时间:2014-02-13 01:38:32

标签: javascript object

我有一系列像这样的关键词:

var keywords = ['red', 'blue', 'green'];

这样的对象:

var person = {
    name: 'John',
    quote: 'I love the color blue'
};

如何确定person对象中的任何值是否包含任何关键字?

更新

这是我最终使用的。谢谢大家!

http://jsbin.com/weyal/10/edit?js,console

5 个答案:

答案 0 :(得分:4)

function isSubstring(w){
  for(var k in person) if(person[k].indexOf(w)!=-1) return true;
  return false
}

keywords.some(isSubstring) // true if a value contains a keyword, else false

这是区分大小写的,不尊重字边界。


第二回答

以下是一种案例 - 不敏感 尊重字词边界。

var regex = new RegExp('\\b('+keywords.join('|')+')\\b','i');
function anyValueMatches( o, r ) {
  for( var k in o ) if( r.test(o[k]) ) return true;
  return false;
}

anyValueMatches(person,regex) // true if a value contains a keyword, else false

如果任何keywords包含在RegExp中具有特殊含义的字符,则必须对其进行转义。

答案 1 :(得分:3)

如果person只包含字符串,则应该这样做:

for (var attr in person) {
  if (person.hasOwnProperty(attr)) {
    keywords.forEach(function(keyword) {
      if (person[attr].indexOf(keyword) !== -1) {
        console.log("Found " + keyword + " in " + attr);
      }
    });
  }
}

如果你想深度搜索,那么你需要一个对对象进行递归的函数。

答案 2 :(得分:1)

遍历对象中的每个属性,然后将属性拆分为标记,并使用indexOf检查每个标记是否在数组中。 indexOf将无法在旧浏览器上使用,我相信IE< 9,但你可以在MDN documentation找到一个垫片。

var person = {
    name: 'John',
    quote: 'I love the color blue'
};

var person2 = {
    name: 'John',
    quote: 'I love the color orange'
};

var keywords = ['red', 'blue', 'green'];

function contains(obj, keywords){
    for(x in person){
        if(obj.hasOwnProperty(x)){
            var tokens = obj[x].split(/\s/);
            for(var i = 0; i < tokens.length; i++){
                if(keywords.indexOf(tokens[i])!= -1){
                   return true;
                }
            }
        }
    }
    return false;
}

alert(contains(person, keywords));
alert(contains(person2, keywords));

JS小提琴: http://jsfiddle.net/BaC5p/

答案 3 :(得分:0)

function testKeyWords(keywords) {
    var keyWordsExp = new RegExp('\b(' + keywords.join(')|(') + ')\b', 'g');
    for(var key in person) {
        if(keyWordsExp.test(person[key])) {
            return true;
        }
    }
    return false;
}

答案 4 :(得分:0)

最舒服的方法是将.contains(str)添加到StringArray原型中:

if (typeof String.prototype.contains === 'undefined') {
    String.prototype.contains = function (it) {
        return this.indexOf(it) != -1;
    };
}
if (typeof Array.prototype.contains === 'undefined') {
    Array.prototype.contains = function (it) {
        for (var i in this) {
            var elem = this[i].toString();
            if (elem.contains(it)) return true;
        }
        return false;
    };
}

如果您将上面的代码放入您包含的.js文件中,则可以在代码中的任何位置使用它,如下所示:

var b = ["A Bell", "A Book", "A Candle"];

var result1 = b.contains("Book"); // returns: true, it is contained in "A Book"
var result2 = b.contains("Books"); // returns: false, it is not contained
相关问题