我有一系列像这样的关键词:
var keywords = ['red', 'blue', 'green'];
这样的对象:
var person = {
name: 'John',
quote: 'I love the color blue'
};
如何确定person对象中的任何值是否包含任何关键字?
的更新 的
这是我最终使用的。谢谢大家!
答案 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)
添加到String
和Array
原型中:
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